对齐规则
- 1 首先struct和class中的各类型数据成员的位置偏移量offset要内存对齐,规则是
偏移量offset必须是min(#paragma pack(n), 该数据成员所占字节数)的倍数
- 2 其次,struct和class本身也要内存对齐,
struct和class本身所占字节数必须是min(#paragma pack(n), 类内最长数据成员所占字节数)的倍数
例子
#include<iostream>
using namespace std;
class A{
private:
int a;
char b;
char c;
};
class B{
private:
char b;//offset=0,是min(#paragma pack(4),1)=1的倍数,占索引[0]
int a; //offset=1,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面char要内存补齐,char占索引[0,1,2,3],int占索引[4,5,6,7]
char c;//offset=8,是min(#paragma pack(4),1)=1的倍数,char占索引[8]
//各个类型的数据成员内存对齐后,所占字节数为9,然后class本身也要内存对齐,
//因为9不是是min(#paragma pack(4),4)=4的倍数,因此这里class需要填补3个字节数,最终内存对齐字节数sizeof(B)=12,char占索引[8,9,10,11]
};
class C{
private:
char b;
char c;
int a;
};
class D{
private:
short b;//offset=0,是min(#paragma pack(4),2)=2的倍数,占索引[0,1]
char c;//offset=2,是min(#paragma pack(4),1)=1的倍数,占索引[2]
int a;//offset=3,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面char要内存补齐,char占索引[2,3],int占索引[4,5,6,7]
//各个类型的数据成员内存对齐后,所占字节数为8,然后class本身也要内存对齐,
//因为8是min(#paragma pack(4),4)=4的倍数,因此这里class不需要填补,最终内存对齐字节数sizeof(D)=8
};
class E{
private:
short b;//offset=0,是min(#paragma pack(4),2)=2的倍数,占索引[0,1]
int a;//offset=2,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面short要内存补齐,short占索引[0,1,2,3],int占索引[4,5,6,7]
char c;//offset=8,是min(#paragma pack(4),1)=1的倍数,占索引[8]
//各个类型的数据成员内存对齐后,所占字节数为9,然后class本身也要内存对齐,
//因为9不是是min(#paragma pack(4),4)=4的倍数,因此这里class需要填补3个字节数,最终内存对齐字节数sizeof(E)=12,char占索引[8,9,10,11]
};
class F{
private:
int a;
short b;
char c;
};
int main(){
cout << "sizeof(A)= " << sizeof(A) << endl; //8
cout << "sizeof(B)= " << sizeof(B) << endl; //12
cout << "sizeof(C)= " << sizeof(C) << endl; //8
cout << "sizeof(D)= " << sizeof(D) << endl; //8
cout << "sizeof(E)= " << sizeof(E) << endl; //12
cout << "sizeof(F)= " << sizeof(F) << endl; //8
return 0;
}
输出为:
sizeof(A)= 8
sizeof(B)= 12
sizeof(C)= 8
sizeof(D)= 8
sizeof(E)= 12
sizeof(F)= 8