關於struct的記憶體對齊問題

2021-07-30 00:26:38 字數 939 閱讀 7042

2. 結構體對齊:結構體中佔位元組最多的成員叫邊界成員,整個結構體所用空間必須是邊界成員所佔位元組的整數倍。

3. 編譯器的對齊指令:

通常不需要我們考慮對齊方式問題,編譯器會自動選擇合適的策略,但也可以通過命令設定:

*#pragma pack(n)*

可以設定變數以n位元組方式對齊。

n位元組對齊有兩種情況:

第一、如果n大於等於該變數所佔位元組數,那麼偏移量必須滿足預設的對齊方式。

第二、如果n小於該變數的型別所占用位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。

結構體總大小仍然要為占用空間最大的成員變數的倍數

因為處理器讀寫資料,並不是以位元組為單位,而是以塊(2,4,6,8,16位元組)為單位進行的,如果不進行記憶體對齊,本來只需要一次進行的訪問,可能要好幾次才能完成。

例:若有結構體a如下定義

struct a

;

我們假設處理器一次從記憶體中取四個位元組,顯然沒有經過記憶體對齊的話,要取兩次才能得到i。當結構體足夠複雜的時候,效率明顯降低。

如果結構體中有位域,準則又要改變:

1)如果相鄰位域字段型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

2)如果相鄰位域字段型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,偏移量為其型別大小的整數倍

3)如果相鄰位域字段型別不同,根據編譯器情況不同來決定結構體的大小

struct a

struct記憶體對齊

出於速度和空間的考量,編譯器在實現過程中均會採用對struct內的變數進行記憶體對齊的操作,雖然會有一定的空間浪費,卻可以減少在讀取資料時候的讀取操作。先看下面的例子 struct a int main struct b int main struct b int main struct a str...

struct記憶體對齊

關於c 中的struct記憶體對齊,應該也是初學者比較疑惑的乙個知識點,但是搞清楚之後會發現非常簡單,這裡解釋一下struct記憶體到底怎麼對齊。主要記住以下兩點 1.各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數 2.整個struct的記憶體大小需為s...

struct 記憶體對齊

struct 是一種復合資料型別,其構成元素既可以是基本資料型別 如 int long float 等 的變數,也可以是 一些復合資料型別 如 array struct union 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自...