struct大小的問題

2021-07-24 06:54:20 字數 830 閱讀 4078

int main();

test a;

a.i = 'f';

a.t = 1;

int i = sizeof(a);

printf("%d\n", sizeof(a.i));

printf("%d\n",sizeof(a.t));

printf("%d\n", i);

system("pause");

return

0;}

執行結果:

1 4

8

#include 

#include

struct test

;int main()

執行結果:

這個結構體的大小為:24

原因:

結構體是一種復合資料型別,通常編譯器會自動的進行其成員變數的對齊,已提高資料訪問的效率。在預設情況下,編譯器為結構體的成員按照自然對齊(natural alignment)條方式分配儲存空間,各個成員按照其宣告順序在儲存器中順序儲存。

在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件

1.結構體第乙個成員的位址和結構體的首位址相同

2.結構體每個成員位址相對於結構體首位址的偏移量(offset)是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組(internal adding)。

3.結構體總的大小要是其成員中最大size的整數倍,如果不是編譯器會在其末尾新增填充位元組(trailing padding)。

簡單來說,struct的大小計算為:其中變數所佔大小的最小公倍數(這個數還必須大於所有變數所佔大小的和)

struct結構大小的問題

1.什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因...

union和struct對齊大小問題

對齊就是要滿足儲存變數的起始位址與對齊大小餘數為0。對於union,分兩步 先算union對齊大小,對齊的大小是取決於union成員中位元組對齊最大的那個 再算union實際分配的空間,而分配給union的實際大小不僅要滿足是對齊大小的整數倍,同時要滿足實際大小不能小於最大成員的大小。如 union...

關於struct大小的計算

結構是乙個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在乙個名字之下。struct型別的計算分為三步 先算struct的對齊大小,對齊的大小也是取決於struct成員中位元組對齊最大的那個 然後根據每個成員的對齊大小對齊每個成員算出分配的空間 最後算出struct實際分...