@3 我们发现,如果结构体到这里就分配结束,那么结构体大小应该为5,但是实际情况却是结构体大小为8。实际上结构体也要进行内存对齐。 此结构体中int a和char c的对齐数分别为4和1,结构体对齐数是成员对齐数中的最大对齐数,则此结构体对齐数大小MAX(4,1)=4,那么,就需要在char c后填补字节到结构体大小为8. ...
所以最后结构体的总大小为40.
如果结构体成员的顺序不合理,可能会导致结构体的大小变得更大。 就像上面我们举的那个例子一样,结构体内部都是两个字符型数据和一个整形数据,但因为顺序不同,结构体的大小可能就完全不一样。 三.利用结构体对齐规律计算结构体大小 1.结构体的对齐规则: 要知道结构体大小是如何计算的,首先需要了解结构体的对齐规则...
//打印出各个结构体的大小3 struct s1{ char ch1;//1 char ch2;//1 int i;//4};//结构体花括号后面要记得加;4 struct s2{ char ch1;//1 int i;//4 char ch2;//1};5 struct s3{ char ch;//1 int i;//4 char str[10];//10};6 struct s4{ char ch;//1 int i...
int 型变量c 也要4字节对齐,所以变量 b 的后面也填充了2个字节,导致整个结构体的大小为12字节。
其中空隙的大小是指编译器为了进行对齐而插入的字节。空隙的大小取决于前一个成员的大小和对齐边界的大小,如果前一个成员的大小不是对齐边界的整数倍,则需要插入空隙。例如,如果前一个成员的大小为3字节,对齐边界为4字节,则需要插入1字节的空隙。 二、结构体大小的影响因素 结构体大小的计算方法已经介绍了,接下来...
结构体大小计算方法是,最后一个成员的偏移量加上其大小。 想象一个长条的缓存中,比如注射器,偏移量就有点像缓存中的活塞位置. 最后一个成员的偏移量,就是之前的成员所占内存和.加上最后一个成员的大小. 1,偏移量的计算也需要技巧, 需要满足:是成员大小的整数倍. ...
先忽略 成员 tmp,结构体 stb 的大小为 16 字节(中间和末尾均需要填充间隙);结构体 sta 的大小为 12 字节。从而可以计算得出,结构体 stb 的实际大小为 16 + 12 = 28 字节。 情形四 使用编译指令,示例代码如下: #pragmapack(1)structS3{inti;intj;charc;}#pragmapack() ...
因为DataC最大的成员类型是int,占用的是4个字节大小,所以总的大小应该是4的倍数,前面计算到DataC的大小应该是9,但是9不是4的倍数,所以DataC的字节9之后一个4的倍数,所以DataC的大小应该是12个字节。 结构体嵌套的大小计算 例如以下的例子,结构体DataD占的是40个字节的大小,是如何计算呢?