內存對齊

對齊規則

  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章