sizeof计算结构体大小(字节对齐)
来源:互联网 发布:php教学网站 编辑:程序博客网 时间:2024/03/29 10:21
引言:sizeof计算结构体的大小经常出现在笔试题中,接下来是对它的一些总结
1.计算结构体大小的准则
-
数据类型 32位机大小(字节) 64位机大小(字节) char 1 1 short 2 2 int 4 4 long 4 8 指针类型 4 8 double 8 8 float 4 4 unsigned int 4 4 long long 8 8 - #pragma pack(n)可以指定对齐值为n(n取1,2,4,8,16)
- 结构体每个变量的 自身对齐移值 = 自身字节大小
- 有效对齐值 = min(自身对齐值,指定对齐值)
- 结构体的自身对齐值为其变量的最大自身对齐值;有效对齐值 = min(自身对齐值,指定对齐值)
- 结构体每个变量相对结构体首地址的偏移量必须是其有效对齐值的整数倍,否则需要后移直到偏移量为有效对齐值整数倍
- 结构体大小为最后一个变量偏移量+最后一个变量大小+补充字节数(之所以要有补充字节数是因为结构体大小需要时有效对齐值得整数倍)
- 空结构体大小为1
2.例子
#pragma pack(8)struct s1{ short a; long b;};struct s2{ char c; s1 d; long long e;};//求sizeof(s2)的值?(32位机)
解:
1. 先看s1,a的有效对齐值为min(2,8)=2,偏移量为0,0%2=0,符合;b的有效对齐值为min(4,8)=4,偏移量本该是0+2=2,但是2%4!=0,所以其偏移量变成4;结构体大小为b的偏移量+b的字节数=4+4=8,结构体s1的有效对齐值为min(4,8)=4,因为8%4=0,所以不需要加补充字节数
2. 再看s2,c的有效对齐值为min(1,8)=1,偏移量为0,0%1=0,符合;d得有效对齐值为上面计算的8,d的偏移量本该是0+1=1,但是1%4!=0,所以d偏移量变成4;e的有效对齐值为min(8,8)=8,e的偏移量本该是d的偏移量加上其大小,为4+8=12,但是12%8!=0,所以e得偏移量为16;s2的大小为16+8=24,因为s2的有效对齐值为min(8,8)=8,24%8=0,所以不需要加补充字节数,s2大小为24
0 0
- sizeof计算结构体大小(字节对齐)
- 计算结构体大小(字节对齐)
- 结构体存储空间大小计算&字节对齐
- 内存的字节对齐及结构体的sizeof计算
- sizeof - 指针,数组,变量,结构体字节对齐-计算
- 内存的字节对齐及结构体的sizeof计算
- sizeof 与结构体大小及结构体对齐问题, 字节对齐
- C++字节对齐与结构体大小计算
- C++字节对齐与结构体大小计算
- sizeof 计算结构体大小
- 字节对齐 结构体的sizeof
- 笔试 sizeof 字节对齐 结构体
- 结构体的sizeof字节对齐问题
- 结构体sizeof不想字节对齐
- 计算结构体的大小(对齐)
- 结构体的内存对齐方式(结构体大小计算 sizeof)(
- C++之字节对齐与结构体大小(转)
- C++之字节对齐与结构体大小(转)
- 小数的精确表达
- 适配器模式(Adapter)
- C# : 读取XML文件 (二)
- Rank
- 霍夫森林(Hough Forest)目标检测算法
- sizeof计算结构体大小(字节对齐)
- 使用servlet实现文件上传(用common-fileUpload和common-io包)
- 在线编程--双栈排序
- Java中重载与重写区别
- mysql_insert_id
- [Java]包与包之间的调用
- HDU 4403A very hard Aoshu problem
- 为Adapter装载数据的方法
- 最大连续字串求和