#include<stdio.h> #pragma pack(2) struct T...{ char i; int d; char ii; }; #pragma pack() int main(int argc,char * argv[]) ...{ printf(\" sizeof(struct T)); return 0; } |
最后输出的结果为:8。
语句#pragma pack(2)的作用是定义了结构体的对齐方式,在这里指定了是按规2字节对齐,在这里我们用PPB来表示该指令指定的对齐字节数,上述代码中的PPB=2。
结构体的内存对齐规则是:
每个成员分别按自己的对齐字节数和PPB(指定的对齐字节数)两个字节数最小的那个对齐,并能最小化长度。
复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
结构体对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
我们按上面的规则来分析上述代码的输出结果为什么是8,分析如下:
变量i默认为1字节,PB=2,所以i按1字节对齐。
变量d默认为4字节(在32位机器中int为4字节),PB=2,所以d按2字节对齐。
变量ii默认为1字节,PB=2,所以ii按1字节对齐。
此时结构体的计算出的字节数为7个字节。最后按规则3,结构体对齐后的字节数为8。可以用图1来示意结构体的字节对齐情况。
对下代码中在一个结构体中声了一个结构体变量。
#include<stdio.h> #pragma pack(2) struct T... int d; char ii; }; #pragma pack() struct TT...{ char c; struct T t; long long d; }; int main(int argc,char * argv[]) ...{ printf(\"%d \",sizeof(struct TT)); return 0; } |