struct 字节对齐
一、概念
- 对齐:对齐与数据在内存中的位置相关。如果一个变量的内存地址正好位于它长度的整数倍,被称作自然对齐。
如在32位cpu下,假设一个int变量的地址是 0x00000004,它就是自然对齐的
- 为什么需要字节对齐
内存基本单位是字节,cpu并非逐字节读取内存的,而是以(2,4,8……)的字节块来读写内存。
如果上面的int变量的地址是0x00000002,cpu就需要访问两次内存了。第一次取0x00000002-0x00000003,第二次取0x00000004-0x00000005. - 对齐规则
- 结构体变量的首地址能够被其对齐字节数的大小所整除
- 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足
- 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足
- 编程考量
- 空间存储(同样内容的结构体,B则只需要12个字节对齐)
struct A { int a; char b; int c; short d; } struct B { int a; char b; short d; int c; }
- 跨平台通信
不同的平台对齐方式可能不同.一般有两种处理方法-
1字节对齐,指令#pragma pack(n)(n为字节对齐数)来使得结构间一字节对齐。任何平台都是最小字节数,节省空间但同时降低了效率。
-
自己对结构进行字节填充(不建议)
-
- 空间存储(同样内容的结构体,B则只需要12个字节对齐)