注意:
出於效率的考慮,c語言引入了位元組對齊機制,一般來說,不同的編譯器位元組對齊機制有所不同,但還是有以下3條通用準則:
(1)結構體變數的大小能夠被其
最寬基本型別成員的大小所整除;
(2)結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
(3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。
位元組對齊第3條準則提及最寬基本型別的概念,所謂基本型別是指像char、short、int、float、double這樣的內建資料型別。「資料寬度」就是指其sizeof的大小。諸如結構體、共用體和陣列等都不是基本資料型別
最寬基本成員 double int char 結構體陣列等都不是最寬基本成元 //結構體大小必須可以整除最寬基本成員 是最寬基本成員的整數倍
結構體成員位址-結構體首位址就是偏移量 必須可以整除成員變數
1 #include 2 #include 34//最寬基本成員 double int char 結構體陣列等都不是最寬基本成員5//
結構體大小必須可以整除最寬基本成員 是最寬基本成員的整數倍67
//結構體成員位址-結構體首位址就是偏移量 必須可以整除成員變數
8struct
info9;
25void
main1()
2631
32void
main()33;
35 printf("
\n%p
",&info11);//
0032fc14
36 printf("
\n%p
",&info11.num);//
0032fc14
37 printf("
\n%p
",&info11.num2);//
0032fc18
38 printf("
\n%p
",&info11.c);//
0032fc1c
3940
getchar();
41 }
C語言結構體的記憶體儲存方式和位元組對齊
環境 ubuntu64位 gcc 先定義乙個空的結構體,通過sizeof檢視發現其占用記憶體位元組為0 在vc 6.0中為1 其他型別資料記憶體位元組大小如下圖 定義乙個非空結構體,再觀察其記憶體位元組大小,發現乙個結構體的大小並非各資料型別大小簡單地相加 為了體現這謎之樂趣,不妨換一種方式來測一測...
C語言 記憶體中結構體位元組對齊
一 位元組對齊作用和原因 對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊,其他平台可能沒有這種情況,但是最常見的是如果不...
結構體在記憶體中的儲存方式
乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 int main 在例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 size...