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實際分...