C語言中的結構體大小

2021-09-26 20:50:10 字數 1649 閱讀 6746

現代計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任意型別的變數。但實際中在訪問特定型別變數時經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序乙個接乙個地存放,這就是對齊。

不同硬體平台對儲存空間的處理上存在很大的不同。某些平台對特定型別的資料只能從特定位址開始訪問,而不允許其在記憶體中任意存放。例如motorola 68000 處理器不允許16位的字存放在奇位址,否則會觸發異常,因此在這種架構下程式設計必須保證位元組對齊。但最常見的情況是,如果不按照平台要求對資料存放進行對齊,會帶來訪問效率上的損失。比如32位的intel處理器通過匯流排訪問(包括讀和寫)記憶體資料。每個匯流排週期從偶位址開始訪問32位記憶體資料,記憶體資料以位元組為單位存放。如果乙個32位的資料沒有存放在4位元組整除的記憶體位址處,那麼處理器就需要2個匯流排週期對其進行訪問,顯然訪問效率下降很多。因此,通過合理的記憶體對齊可以提高訪問效率。為使cpu能夠對資料進行快速訪問,資料的起始位址應具有「對齊」特性。比如4位元組資料的起始位址應位於4位元組邊界上,即起始位址能夠被4整除。此外,合理利用位元組對齊還可以有效地節省儲存空間。但要注意,在32位機中使用1位元組或2位元組對齊,反而會降低變數訪問速度。因此需要考慮處理器型別。還應考慮編譯器的型別。在vc/c++和gnu gcc中都是預設是4位元組對齊。在c語言中,結構體是種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如陣列、結構體、聯合等)的資料單元。編譯器為結構體的每

個成員按照其自然邊界(alignment)分配空間。各成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。

資料型別自身的對齊值:char型資料自身對齊值為1位元組,short型資料為2位元組,int/float型為4位元組,double型為8位元組。

結構體或類的自身對齊值:其成員中自身對齊值最大的那個值。

指定對齊值:#pragma pack (value)時的指定對齊值value。

資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小者,即有效對齊值=min。

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

結構體每個成員相對結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。

對於以上規則的說明如下

編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能被該基本資料型別所整除的位置,作為結構體的首位址。將這個最寬的基本資料型別的大小作為上面介紹的對齊模數。

為結構體的乙個成員開闢空間之前,編譯器首先檢查預開闢空間的首位址相對於結構體首位址的偏移是否是本成員大小的整數倍,若是,則存放本成員,反之,則在本成員和上乙個成員之間填充一定的位元組,以達到整數倍的要求,也就是將預開闢空間的首位址後移幾個位元組。

結構體總大小是包括填充位元組,最後乙個成員滿足上面兩條以外,還必須滿足第三條,否則就必須在最後填充幾個位元組以達到本條要求。

使用指令#pragma pack (n),編譯器將按照 n 個位元組對齊。

使用指令#pragma pack (),編譯器將取消自定義位元組對齊方式。

在#pragma pack (n)和#pragma pack ()之間的**按 n 個位元組對齊。

C語言中結構體占用記憶體大小

這個問題很經典,很容易出現,也叫記憶體的4k對齊吧 cpu傳輸資料的方式 cpu每次傳輸資料大小由它的總線條數決定,32位傳輸4個位元組,64位傳輸8個位元組。這裡以64位系統舉例,若宣告乙個變數大小為8位元組,起始位址位1,而cpu讀取的位址為0 7,則該變數需要讀取兩次,顯然降低了cpu的效能。...

C語言中結構體

struct oursvoid main struct ours o2 01 結構體整體直接賦值的時候,即使字串也可以直接賦值 o1.str o2.str 錯誤,字串不能直接賦值 字串拷貝的方式 sprintf o1.str,02.str strcpy o1.str,o2.str 3.1 第一種情況...

C語言中的結構體

在 c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。結構體可以被宣告為 變數 指標或 陣列等,用以實現較複雜的 資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員 member 且這些成員可以為不同的型別,成員...