結構體內存對齊規則

2021-07-22 14:36:52 字數 1214 閱讀 6248

今天又聽了一遍結構體內存對齊規則,明白了

按照結構體內存規則來計算, 再遇到結構體套結構體或結構體套陣列的情況, 也能計算清楚。

//#include "stdafx.h"

#include

#include

#include

#include

struct tagtest ;

/**結構成員的對齊開始位址由結構成員size和預設對齊值中的最小者決定

如果結構成員是陣列,陣列的對齊開始位址由陣列元素的size和預設對齊值中的最小者決定

e.g.

假設預設對齊值是8

tagtest.c 偏移開始位址由上乙個結構成員末尾位址(就是偏移0)開始計算, 對齊值為1(sizeof(char) = 1, 預設對齊值 = 8, 兩者最小值為1), 0 % 1 = 0, 偏移位址 就是0

tagtest.i 偏移開始位址由上乙個結構成員末尾位址(是偏移1)開始計算, 對齊值為4(sizeof(int) = 4, 預設對齊值 = 8, 兩者最小值為4), 1 % 4 != 0, 偏移位址要推到4

tagtest.w 偏移開始位址由上乙個結構成員末尾位址(是偏移8)開始計算, 對齊值為2(sizeof(short) = 2, 預設對齊值 = 8, 兩者最小值為2), 8 % 2 == 0, 偏移位址 就是8

tagtest.dbl 偏移開始位址由上乙個結構成員末尾位址(是偏移10)開始計算, 對齊值為8(sizeof(double) = 8, 預設對齊值 = 8, 兩者最小值為8), 10 % 8 != 0, 偏移位址要推到16

tagtest.c1 偏移開始位址由上乙個結構成員末尾位址(是偏移24)開始計算, 對齊值為1(sizeof(char) = 1, 預設對齊值 = 8, 兩者最小值為1), 24 % 1 == 0, 偏移位址 就是24

結構的size由結構成員size最大者和預設對齊值中的最大者決定

e.g.

理論size = 24 + 1 = 25,

記憶體對齊值 = 結構的size由結構成員size最大者(8 => double)和預設對齊值(8)中的最大者(8)決定 = 8

實際size = 25 推到 32, 才能被記憶體對齊值整除

所以tagtest的實際size = 32

用offsetof 和 sizeof 對結構成員和結構size進行測量,可以驗證記憶體對齊的規則

*/int main(int argc, char* argv)

結構體內存對齊規則

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

結構體內存對齊規則

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

C 中結構體內存對齊規則

c語言中結構體內存對齊規則 對齊規則 記憶體偏移為該資料型別的最小整數倍 總體占用記憶體為結構體中最大資料型別的整數倍 舉個?首先,要搞清楚每一種資料型別占用記憶體為多少,在這裡,是針對64位linux macos 為例的 nslog char zd sizeof char nslog double...