以delphi为例:
TTest = record
c1: char;
i1: Integer;
c2: char;
c3: Char;
end;
这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+1+1=7么,不是,是4*3 = 12; 这是因为32位编译的时候,默认结构会自动内存对齐(32bit = 4byte)。
如果要想让这个结构占用7个字节的话,必须加上packed关键字。如下:
TTest = packed record
c1: char;
i1: Integer;
c2: char;
c3: Char;
end;
c中也有类似的语法,如
#define ATTRIBUTE_PACKED __attribute__((packed))typedef struct {
...
} ATTRIBUTE_PACKED record_t;
__attribute__ ((packed)); 是说取消结构在编译过程中的优化对齐。
__attribute__ ((aligned (64))); 是说让dummy成员对齐在64-bit自然边界上。
再附两种情况增加理解:
TTest = record
c1: char;
i1: Integer;
end;
//占用8字节
TTest = record
c1: char;
i1: Integer;
c2: char;
end;
//占用12字节
TTest = record
c1: char;
end;
//占用1字节