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字节。