對齊規則
- 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