C/C++结构体大小的计算方法(Windows 32为处理器)
2018-03-23 15:50
357 查看
定义
结构体中的偏移量
结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。结构体大小计算
结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。结构体内偏移规则
1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。 (内存对齐时为什么结构体的最终大小需要是其最大成员大小的整数倍 )
struct unknown { int a; char b; int c; long long d; char e; }; printf("%lu\n", sizeof(struct unknown)); //output :
结构体重共有一个long类型,两个char类型,两个int类型成员。如果只按照这几个成员大小相加,结构体大小应该是 8 + 2 * 4 + 2 * 1 = 18 个字节大小。但实际上该结构体是32个字节大小。
下面来一步步分析编译器是如何计算大小进行分配的。(以下未标明单位的数字以字节为单位)
1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条。2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。
3、成员变量c,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c之间填充三个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下。
4、成员变量d,偏移量为12,大小为8,不符合偏移规则第一条,在成员c和d之间填充4个字节,此时偏移量为16,符合偏移规则第一条,继续往下。
5、成员变量e,偏移量为24,大小为1,符合偏移规则第一条。
6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long long类型,8个字节,当前结构体计算出的大小为25,并不符合第二条规则,于是在末尾填充7个字节,总大小为32个字节,满足第二条偏移规则。到此结构体大小计算结束。
相关文章推荐
- 【C++】结构体、联合体大小计算
- c/c++在windows下获取时间和计算时间差的几种方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结
- C++ 类的空间大小计算基本方法
- 共用体和结构体所占内存大小的计算方法一
- C++中类的大小计算方法总结《网络+总结》
- c++ 在windows下获取时间和计算时间差的几种方法总结
- C++中类的大小计算方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结
- C++ 内存对齐 (计算结构体的大小)
- c和c++在windows下获取时间和计算时间差的方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结 【转】
- [C/C++]结构体大小的计算方法
- c/c++在windows下获取时间和计算时间差的几种方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结
- c/c++在windows下获取时间和计算时间差的几种方法总结
- [置顶] C/C++中结构体占用内存大小的计算方法
- 我计算结构体和联合体大小的方法
- 结构体,联合的位域定义方法,以及结构体大小的计算