c語言結構體在記憶體中儲存,位元組對齊

2021-09-26 08:35:32 字數 1134 閱讀 7142

注意:

出於效率的考慮,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...