關於C語言 記憶體對齊的問題

2022-03-13 00:19:56 字數 821 閱讀 6530

c語言也和撲克牌一樣, 易學難精。 對於 記憶體對齊的問題, 一直知道有這樣的事實存在,卻沒有真的理解過如何來的 。

2、效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。

下面開始對記憶體對齊的進行具體認識。(演示於vs2010, 以結構體為例)

在vs2010裡, 預設情況下,編譯器會對記憶體進行自動對齊(以最高效能方式對齊)。

struct test1

char a;

char b;

int c;

int d;

};這時sizeof(struct test1) == 12;

struct test2

char a;

char b;

double c;

double d;

};這時sizeof(struct test2) == 24;

但如果在程式段中加入一下**,就可以自定義記憶體對齊

#pragma pack(n)//編譯器將按照n位元組對齊,n為整數,

#pragma pack()//編譯器將取消自定義對齊。

同樣是上面兩個結構體,如果分別依次在前面加上#pragma pack(1)、#pragma pack(4)和#pragma pack(8)時,那麼結果會是

10和18;12和20;12和24

note:雖然指定了n位元組對齊,但不是所有成員都以n位元組對齊,而是按照成員型別與中較小的那個進行對齊。

ps:所謂的對齊的意思就是 offset%n = 0 (offset為偏移位址,n為上述兩者較小的數)

c語言記憶體對齊問題

計算機中的記憶體都是按照byte為單位進行分配,在理論上資料可以儲存在記憶體中的任意位置。計算機為了提高工作效率,一般要求記憶體中的資料存放在特定的位置,使計算機用最少的機器週期便可以訪問到這個資料,這就是c語言中的記憶體對齊問題。這裡以 int 型資料為例,如果記憶體中的資料按照4位元組對齊儲存,...

C語言結構體對齊 記憶體對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...

C語言中記憶體對齊問題

在日常的開發工作中,時常要用到結構體的定義工作,但是結構體中資料的定義順序是否合理直接影響了結構體所佔記憶體的大小,所以了解c語言中記憶體對齊的知識十分有必要。關於記憶體對齊的原則,我們首先討論沒有定義巨集 pragam pack 的情況,在該巨集沒有定義的情況之下,c語言中結構體的記憶體對齊問題主...