一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则,有宏定义的情况下结构体的自身宽度就是宏上规定的数值大小,所有内存都按照这个宽度去布局(这样说其实不太严谨,后面会提到),#pragma pack 参数只能是 '1', '2', '4', '8', or '16'。 二、在没有#pragma pack这个宏的声明...
偏移对齐是指:一个结构体成员相对于结构体起始地址的偏移量所应该进行的对齐。可以理解为,假设结构体的起始地址为0x0,每个成员的起始地址都要求满足自然对齐。当成员不满足偏移对齐原则时,编译器会自动在结构体成员之间进行数据填充。 尾部对齐是指:在结构体的内部成员起始地址满足偏移对齐后,还需要保证结构体的大小为...
在C语言中,结构体(struct)是一种用户自定义的数据类型,可以包含不同类型的数据成员。在定义结构体时,编译器会根据平台的要求对结构体的内存进行对齐,以提高内存访问的效率。结构体内存对齐可以避免因为数据成员的排列顺序不同而导致的内存浪费和性能问题。 1. 结构体内存对齐原则 在C语言中,结构体内存对齐的原则可以...
结构体中包含基础类型的数组类型: // 此结构体元素s1占用最大内存,因此对齐字节为8 // s1:元素开始位置为0,占用8个字节,结束字节是7 // s2:元素开始字节为8,占用10个字节,结束字节是17 // s3:元素开始字节为18,占用1个字节,结束字节为18(至此已占用19字节) // 因此整个结构体占用24 个字节(3*8=24)...
可以看到由于char类型成员c的存在,使得long类型成员前需要有大量空白空间才能满足对齐要求,浪费了比较多的空间。如果将成员b和c调换顺序则,只需要16-bytes内存空间。 规则二:结构体补齐 结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(...
这段代码里我们使用了#pagma pack宏,表示结构体按1字节对齐。也就是说结构体变量st_val3总大小是内部成员变量占用字节数总和,没有字节填充。 现在编译运行如下: sizeof(structst3)=16st_val3addr=0x7ffee13a93b8st_val3.a1addr=0x7ffee13a93b8st_val3.a2addr=0x7ffee13a93bcst_val3.a3addr=0x7ffee...
数据类型自身的对齐值:对于char型的数据,其自身对齐值为1,对于short型为2, 对于int, float, double类型,其自身对齐值为4个字节。2. 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。3. 指定对齐值:pragma pack (value)时指泄的对齐value。4. 数据成员、结构体和类的有效对齐值:自身对齐值和指...
(1)数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。 (2)结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。 (3)指定对齐值:#pragma pack (value)时的指定对齐值value。 (4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中...
结构体对齐的规则首先要看有没有用#pragma pack宏声明,使用这个预编译指令可以改变对齐规则, 有宏定义的情况下结构体自身的大小应为预编译指定规定对齐的大小的整数倍,同时结构体内的成员的地址也会按照预编译指定规定的大小对齐,#pragma pack 参数可以是 "1" "2" "4" "8" 或者 "16" ...