C语言结构体的字节对齐方式
当采用sizeof获取结构体大小时,需要考虑内存排列问题。sizeof用于结构体拷贝,比较方便。以下以32位操作系统,x86排列结构,BCB6编译器举例说明。
测试1
struct A
{
int a;
char b;
short c;
};
A a;
sizeof(a) = 8;
实际使用7个字节,sizeof为8字节,内存排列示意:
|-------int-------| 4字节
|char|--|--short--| 4字节
测试2
struct B
{
char b;
int a;
short c;
};
B a;
sizeof(a) = 12;
实际使用7个字节,sizeof为12字节,内存排列示意:
|char|----|----|----| 4字节
|--------int--------| 4字节
|--short--|----|----| 4字节
测试3
struct C
{
bool b;
A a;
short s;
};
C a;
sizeof(a) = 16;
实际使用10.1个字节,sizeof为16字节,内存排列示意:
|-------bool--------| 4字节
|-------a.a---------| 8字节
|--short--|----|----| 4字节
总结:32位操作系统,内存以4字节对齐排列,正好32位字长。bool,有无符号int,log均占4字节,不需考虑,char和short需要注意。
注意:当含有double(双精度浮点)需要8字节存储,占用8字节内存,所有对齐扩展到8字节。
浙公网安备 33010602011771号