關於面試題中結構體內存對齊計算總結

2021-08-19 12:59:33 字數 1852 閱讀 5653

原則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 咋一看,不知道這題想要考什麼,無從下手。其實該題...