三、内存对齐
1 为什么要内存对齐
现在的操作系统一般都是32位或者64位,一次性内存访问可以读取4个字节或者8个字节。
比如我们使用64位操作系统,地址从0开始,我们把8字节double
放到了0x4位置。系统读取内存的时候,就需要两次读取再合并数据。先从0x0读取8字节,再从0x08读取8字节。
2 内存对齐规则
-
第一个成员在与结构体变量偏移量为0的地址处。
-
其他变量要对齐到某个数字(对齐数)的整数倍的地址处(一般对齐数都等于成员本身占用内存字节数)
-
结构体总大小为最大对齐数(每个成员变量都有对齐数)的整数倍
3 举例
示例程序目录/assets/CProgrammingLanguage/02_MemoryAlignment/
/* sizeof (struct S1) = 12 */
struct S1{
char c1; /* 0 */
int n; /* 4 */
char c2; /* 8 */
};
/* sizeof (struct S2) = 8 */
struct S2{
int n; /* 0 */
char c1; /* 4 */
char c2; /* 5 */
};
结构体S1
中,第二个成员int n
的对齐数是4,第一个成员占用了一个字节,4的最小整数倍是4,所以第二个成员只能放在0x4位置。该结构体的最大对齐数是4
,第三个成员放到了0x08位置,一共占用了9个字节,为了内存对齐,所以3 * 4 = 12
。