自对齐(self-aligned)
C语言是自对齐的,32位以4字节对齐,64位以8字节对齐(1字节=8 bits)
自对齐的好处:在一条指令内完成数据的取或者存的操作,使得内存访问更快;否则,如果一个变量跨机器字存储,那么要做两次或更多次的访问(先取存在前一个机器字的内容,再取存在后一个机器字的内容)。
对齐要求:
- 字符可以起始于任何字节地址
- 2字节的short int必须起始于偶数地址
- 4字节的int或者float必须起始于被4整除的地址
- 8字节的long int或者double必须起始于被8整除的地址
- struct按照最宽成员进行指针对齐。如果struct中嵌套struct,外部struct要按照自己与内部struct中最宽的成员进行对齐。
内存中的实际存储情况:
例1:代码
char *p; char c; int x;
内存中的存储
char *p; //4 bytes(32位)或8 bytes(64位) char c; //1 byte char pad[3]; //3 bytes,无用空间,老派术语称之为slop(水坑) int x; // 4 bytes
消除水坑
可以通过改变变量声明的位置挤掉水坑。
水坑发生于大数据类型的存储区域紧跟在一个较小的数据类型的存储区域之后。
消除水坑的方法是按对齐的降序来对变量进行声明。