c++ 内存对齐方式

对齐规则

1)对齐关键字 #pragma pack(N) 设置了对齐字节数
2)设m为class A的最大成员变量的字节数,n = min{N,m}
3)class A的整体字节数应该是n的倍数
4)class A成员的对齐值的计算方式:其首地址应该是min{n,j}的倍数,其中j为 该成员所占的字节数

举例说明

例1 :默认对齐方式

// m= 8
// 此处没有设置#pragma pack, n = m = 8
class A{
    
    
  int a; // 起始地址0,占用[0-3]
  double b;// 起始地址min{8,8}的倍数,占用地址[8-15]
  char c; // 起始地址min{8,1}的倍数,占用地址[17-17]
  short d;// 起始地址min{8,2}的倍数,占用地址[18-19]
}; // 整体大小为8的倍数,因此占用24字节

cout << sizeof(A) << endl; // output: 24

例2:设置#pragma pack(4)

#pragma push()
#pragma pack(4)
// m= 8
// n = min{4,8} = 4
class A{
    
    
  int a; // 起始地址0,占用[0-3]
  double b;// 起始地址min{4,8}的倍数,占用地址[4-11]
  char c; // 起始地址min{4,1}的倍数,占用地址[12-12]
  short d;// 起始地址min{4,2}的倍数,占用地址[14-15]
}; // 整体大小为4的倍数,因此占用16字节
#pragma pop()
cout << sizeof(A) << endl; // output: 16

猜你喜欢

转载自blog.csdn.net/Fei20140908/article/details/120116795