結構體內存對齊的規則中,你知道這幾點嗎

2021-10-03 20:16:54 字數 886 閱讀 7506

都知道結構體是自定義型別;下面例子中:

struct student 

int main () ;

struct student s2 = ;

s = s2;//可以完成名字的賦值;

// s.name = s2.name; //不可以賦值,要想賦值,必須借助於strcpy()的字串函式

strcpy(s.name, s2.name);

return 0;

}

規則1:描述的是結構體內第乙個成員的布局,是與結構體重合的位址;(也就是說第乙個成員在結構體變數偏移量為0的位址處)

規則2:描述的是結構體中除了第乙個成員之外,其他成員的對齊規則;(其他成員變數要對齊到某個數字[對齊數]的整數倍的位址處);

對齊數 = 編譯器預設的乙個對齊數 與 該成員大小中的較小值. 

vs中預設的是8;         linux中無預設值說法,或者說linux中預設與當前欄位的sizeof一樣.

規則3:描述的是整個結構體的大小,為最大對齊數的整數倍

規則4:如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數             (含巢狀結構體的對齊數)的整數倍

#pragma pack (n)其中的n就是想要修改對齊數為n;

**生效從這一行開始,一直到檔案的末尾結束;

如果需要還原為預設的對齊數,則在 #pragma pack (),括號內不寫引數

結構體內存對齊規則

今天又聽了一遍結構體內存對齊規則,明白了 按照結構體內存規則來計算,再遇到結構體套結構體或結構體套陣列的情況,也能計算清楚。include stdafx.h include include include include struct tagtest 結構成員的對齊開始位址由結構成員size和預設對...

結構體內存對齊規則

記憶體對齊是出於提高記憶體訪問效率的考慮,其記憶體對齊規則如下 1 結構體中第乙個成員的位址偏移 offset 為0 2 其餘成員按照定義順序,其位址偏移量為各自對齊數的整數倍 3 最終結構體的整體大小為其最大對齊數的整數倍,不足在末尾補齊。4 對於內部巢狀了結構體的情況,其對齊數為該內嵌結構體的最...

結構體內存對齊規則

4.補充 5.總結 宣告乙個結構體型別,它所佔位元組為所有成員的位元組的總和?顯然是錯誤的基本的資料型別有char int double float。這個條件是很重要的,當你把結構體所佔記憶體位元組數算出來以後,你不要立即下結論,這個時候你要看看此時的值是否為最寬基本資料型別大小的整數倍。而往往有人...