太一的博客

一个程序学徒

内存对齐

内存对齐

  • 什么是内存对齐
    • 编译器为每个“数据单元”安排在某个合适的位置上
    • C、C++ 语言非常灵活,它允许你干涉“内存对齐”
  • 为什么要对齐
    • 性能原因:在对齐的地址上访问数据更快
  • 如何对齐
    • 第一个数据成员放在 offset0 的位置
    • 其它成员对齐至 min(sizeof(member), #pragma pack) 的整数倍
    • 整个结构体也要对齐,结构体总大小对齐至各个成员中最大对齐数的整数倍

先看一个示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
Test test;
// 第一个成员与结构体变量的偏移量为0
cout << &test << endl; // 0xfffffedff190
cout << (void*)&test.a << endl; // 0xfffffedff190

// 其它成员要对齐到某个数字(对齐数)的整数倍的地址
// 对齐数取编译器预设的一个对齐整数与该成员大小的较小值
cout << sizeof(Test) << endl; // 16 如果#pragma pack(4)则为12
return 0;
}