获取结构体字节数简单的方法
来源:互联网 发布:access 导入sqlserver 编辑:程序博客网 时间:2024/04/30 12:10
结构体计算要遵循字节对齐原则
结构体默认的字节对齐一般满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)
其实 暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍
先看下面定义的两个结构体.
struct { char a; short b; char c; }S1;
struct { char a; char b; short c; }S2;
分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4
注意 为什么 仅仅改变了结构体成员的顺序,结果不一样?
解:
(1)首先找出成员变量中最大的字节,可见对于S1和S2 最大是short ,占2个字节,
(2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节,
(3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准
对于S1 ,来说,顺序是 char->short->char
所以对于S1结构体大小为 2*3=6,至于为什么第二个char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍
对于S2 嘛,也画个图,但是顺序是 char->char->short
第一个char占一个字节第二个char占一个字节short 刚好占2个字节S2=2*2=4
按照这个方法再看这样的一个结构体:
struct stu1
{
int i;
char c;
int j;
};
很明显:最大字节为4个。顺序int char int
因为 int占4个,而char已经咱了一个,不够,所以那三个只能多余占位
Stu1=3*4=12
那么换一下呢?
struct stu2
{
int i;
int j;
char c;
};
Stu2=3*4=12;
再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行
typedef struct A
{
char a1;
short int a2;
int a3;
double d;
};
A=16
typedef struct B
{
long int b2;
short int b1;
A a;
};
而对于B,先不要管A a,也就是先去掉A a 成员结构体B 算得 其为8,所以最后结果为8+16=24;踩
- 获取结构体字节数简单的方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- sizeof的详尽计算结构体字节数方法
- Javascript获取字符串字节数的方法
- C++获取文本文件字节数的方法
- 计算结构体的字节数
- C++获取文本文件字节数的一个小方法
- C++获取文本文件字节数的一个小方法
- C++获取文本文件字节数的一个小方法
- C++获取文本文件字节数的一个小方法
- 结构体中的字节数
- 获取字符串的字节数
- 获取文件的字节数
- HDU 1180诡异的楼梯 解题报告
- socket实现用户端 登录 服务器端 用户名验证
- 关于LeetCode中Longest Common Prefix一题的理解
- android 代码获取版本信息
- 邮件服务器小结
- 获取结构体字节数简单的方法
- ViewHolder的二次封装
- 安装和使用CocoaPods
- Android的handler详解
- UVA 1153 - Keep the Customer Satisfied(贪心)
- jquery ajax 请求函数封装
- 全能型开源远程终端:MobaXterm
- innodb表最大列数限制
- window.prompt()输入对话框