原則1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。原則2:結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。
linux 預設#pragma pack(4)window 預設#pragma pack(8)
注:可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數,其中的n就是指定的「對齊係數」。
#pragma pack(1)
struct aa ;
#pragma pack()
整體對齊係數 = min((max(int,short,char), 1) = 1,所以不需要再進行整體對齊。整體大小就為8。
#pragma pack(2)
struct aa ;
#pragma pack()
整體對齊係數 = min((max(int,short,char), 2) = 2,將9提公升到2的倍數,則為10.所以最終結果為10個位元組。
#pragma pack(4)
struct aa ;
#pragma pack()
整體對齊係數 = min((max(int,short,char), 4) = 4,將9提公升到4的倍數,則為12.所以最終結果為12個位元組。
#pragma pack(8)
struct aa ;
#pragma pack()
整體對齊係數 = min((max(int,short,char), 8) = 4,將9提公升到4的倍數,則為12.所以最終結果為12個位元組。圖示如上。
注:可以通過stddef.h庫中的offsetof巨集來檢視對應結構體元素的偏移量。
struct ee
; //整體對齊係數 = min((max(int,short,char), 8) = 4,將記憶體大小由17補齊到4的整數倍20
char d; //長度1 < 8 按1對齊;偏移量為21;存放位置區間[21]
//整體對齊係數 = min((max(int,short,char), 8) = 4,將記憶體大小由21補齊到4的整數倍24
//整體對齊係數 = min((max(int,double,float), 8) = 8,將記憶體大小由28補齊到8的整數倍32
類和物件(上篇)之面試題(結構體內存對齊)
問題 c 中struct和class的區別是什麼?解答 c 需要相容c語言,所以c 中struct可以當成結構體去使用。另外c 中struct還可以用來定義類。和class是定義類是一樣的,區別是struct的成員預設訪問方式是public,class是struct的成員預設訪問方式是private...
關於記憶體對齊的面試題
鄭重宣告 本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!請說出如下2種方式,哪種更好,為什麼?方式一 void foo int a,float b,char ch,double d,float f 方式二 structa void foo a pa 咋一看,不知道這題想要考什麼,無從下手。其實該題...
關於記憶體對齊的面試題
鄭重宣告 本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!請說出如下2種方式,哪種更好,為什麼?方式一 void foo int a,float b,char ch,double d,float f 方式二 structa void foo a pa 咋一看,不知道這題想要考什麼,無從下手。其實該題...