- (1).第一个成员在与结构体变量偏移量为0的地址处;
- (2).其他成员变量要对齐到对齐数的整数倍的地址处; 对齐数:编译器的默认对齐数与该成员大小的较小值; (默认对齐数 vs:8,linux:4)
- (3).结构体的总大小为最大对齐数的整数倍。
-
(4).如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。
struct S { int a; char b; double c; }; //则此结构体大小为16stuct A { doulbe d; char e; }; struct S { int a; char b; struct A C; double c; }; //结构体S的大小为32内存对齐的原因:
- (1).平台原因:不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些地址处取某些特定类型的数据,否则将抛出硬件异常。
-
(2).性能原因:数据结构应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,而对齐的内存访问仅需要一次访问。
5.结构体位段
位段的声明和结构类似,但位段的成员是一个或多个位的字段。位段成员必须声明位int,unsigned int或signed int类型。在成员的后面是一个冒号和一个整数,这个整数就是该位段所占用的位的大小。
struct S { int a : 7; signed int b : 6; unsigned int c : 12; };位段的数据存储:










