sizeof结构体
来源:互联网 发布:爽肤水怎么用 知乎 编辑:程序博客网 时间:2024/06/14 09:35
首先有几条规则:
1. 结构体的成员相对于结构体的偏移量,是该成员所包含的最大简单类型(指占用内存数)的整数倍(如果该成员本身又是一个结构体,就要递归查找其简单类型,简单类型就是char short int float double,long)
比如struct a1{
char a[5];
int b;
}aa;
struct a2{
double a;
char b;
a1 c;
char d;
}bb;
此例中,aa.b相对于aa的偏移值是int的整数倍,所以aa.b的偏移值是8,aa.a后面有三字节填充;
a2中bb.c的偏移值是a1所含的最大简单类型的整数倍,a1包含的最大简单类型是int,所以bb.c的偏移值是4的倍数,所以bb.c的偏移值是12,char类型的偏移值是1的倍数,double偏移值是8的倍数。long的长度根据规范,sizeof(long)>=sizeof(int),我的64位机器,vc2005,发现int=long=4字节,64位数据类型必须使用longlong或者其他windows自己定义的类型。
2. 结构体的最终大小,还要通过在结构体的末尾填充字节,使得结构体大小是结构体最大简单类型(如果需要递归查询简单类型的话就要递归取出最大简单类型)的整数倍
上述例子中,bb的大小,必须是8的整数倍. aa的大小为12,a1类型的成员在结构体中的起始位置应该是4的整数倍。这样,a2的大小就是8+1+offset(bb.c) + sizeof(a1) + sizeof(d)+padding = 12+sizeof(a1)+1+ padding = 25+padding = 8的倍数, 所以sizeof(a2)应该取整到32,最后填充了7个字节。
3. 联合类型union也是类似,union的成员的起始偏移(这是指,当union作为复合结构的成员变量时,相对于所在复合体)也要对齐到该成员所含最大简单类型的整数倍上,union的最终大小也要补齐到最大简单类型的整数倍上
比如union b1{
char a[5];
int b;
};
struct b2{
char a[3];
b1 b;
char c;
};
则b1的大小为8(最终大小要对齐到int类型的整数倍上), b2中的b的偏移值,应该是b的子成员的最大简单类型的倍数,也就是b的偏移是4的倍数,所以b的偏移是4,b2的大小为12,b2的成员c的末尾还要补上3个字节,保证b2的大小是其成员中最大简单类型的整数倍。
- 结构体的sizeof
- 结构体的sizeof
- sizeof和结构体
- 结构体的sizeof
- sizeof(结构体)
- sizeof 结构体
- 结构体的sizeof
- sizeof 结构体
- sizeof 和 结构体
- 结构体的sizeof
- sizeof 结构体
- 结构体数组sizeof
- sizeof结构体
- sizeof(结构体)
- sizeof(结构体)
- sizeof(结构体/联合体)
- sizeof结构体
- sizeof遇上结构体
- HDU
- socket的accept函数解析
- Kingbase和PostgreSQL中如何查看当前连接的进程信息
- OpenCV 玩九宫格数独(二):knn 数字识别
- 论坛自动灌水(HTTP协议)--GET请求与POST请求的发送
- sizeof结构体
- IDEA激活码及webstorm
- Bash内置命令test测试文件部分选项
- python中遇到的错误(二)
- Leetcode刷题(22)——确认是否存在两个子集使得其和相等
- java从入门到弃坑第九天
- bzoj 4476: [Jsoi2015]送礼物 二分答案+单调队列
- 总结——01背包问题 (动态规划算法)
- sklearn 样本均衡 class_weight='balanced'的实现方法