C C 中的記憶體補齊機制

2022-08-01 14:51:17 字數 1018 閱讀 9207

今天做了道牛客的題,錯了。之前沒有接觸過記憶體補齊的問題。

題目如下:

在x86系統下,sizeof如下結構體的值是多少?12

345struct

答案是c

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如陣列、結構、聯合等)的資料單元。在結構中,編譯器為結構的每個成員按其自然對界(alignment)條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。例如,下面的結構各成員空間分配情況:struct test;結構的第乙個成員x1為char型別,其自然對界為1,其偏移位址為0,佔據了第1個位元組。第二個成員x2為short型別,其自然對界為2,起始位址必須2位元組對界,因此,編譯器在x2和x1之間填充了乙個空位元組。結構的第三個成員x3和第四個成員x4恰好落在其自然對界位址上,在它們前面不需要額外的填充位元組。在test結構中,成員x3要求4位元組對界,是該結構所有成員中要求的最大對界單元,因而test結構的自然對界條件為4位元組,編譯器在成員x4後面填充了3個空位元組。整個結構所佔據空間為12位元組。

更改c編譯器的預設位元組對齊方式在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。一般地,可以通過下面的方法來改變預設的對界條件:     · 使用偽指令#pragma pack (n),c編譯器將按照n個位元組對齊。     · 使用偽指令#pragma pack (),取消自定義位元組對齊方式。另外,還有如下的一種方式:     · __attribute((aligned (n))),讓所作用的結構成員對齊在n位元組自然邊界上。如果結構中有成員的長度大於n,則按照最大成員的長度來對齊。     · __attribute__ ((packed)),取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊。以上的n = 1, 2, 4, 8, 16... 第一種方式較為常見。

C C 中的記憶體補齊機制

原文 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲...

C C 中的記憶體補齊機制

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第...

C C 記憶體補齊機制

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間 各個成員按照它們被宣告的順序在記憶體中順序儲存,第...