程式設計基礎整理之記憶體對齊

2021-09-26 07:16:44 字數 1090 閱讀 1039

記憶體對齊:

最近學習c/c++時,時常會被問到某一struct或者union的所佔記憶體空間的大小,主要涉及到記憶體對齊的問題。

記憶體對齊應該是編譯器所幹的活。編譯器為程式中的每個「資料單元」安排在適當的位置上。但是c的乙個特點就是太靈活,太強大,它允許程式設計師去干預記憶體對齊。作為程式設計師要想去干預編譯器的記憶體對齊,就需要了解更為底層內容。對於記憶體對齊問題,主要存在於struct和union等復合結構在記憶體中的分布情況,許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制;對於記憶體對齊,主要是為了提高程式的效能,資料結構,特別是棧,應盡可能在自然邊界上對齊,經過對齊後,cpu的記憶體訪問速度大大提公升。

記憶體對齊的作用:

2.硬體原因(效能原因):資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。經過記憶體對齊之後,cpu的記憶體訪問速度大大提公升

記憶體對齊規則:

在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,當儲存過程中需要滿足邊界對齊的 要求時,編譯器會在成員之間留下額外的記憶體空間。如果想確認結構體占多少儲存空間,則使用關鍵字sizeof,如果想得知結構體的某個特定成員在結構體的位置,則使用offsetof巨集(定義於stddef.h)。

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack(n)中指定的數值n和這個資料成員自身長度中,比較小的那個進行,即後面每個資料的偏移量必須是min(#pragma pack()指定的數,這個資料成員的自身長度)的倍數。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma

pack(n)指定的數值n和結構(或聯合)最大資料成員長度中,比較小的那個進行。

3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

編譯之 記憶體對齊

現代計算機中記憶體空間都是按照 byte 劃分的,也就是位元組,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊 從cpu的角度來說,cpu...

C 深陷 之「記憶體對齊」

現代計算機在處理資料時,按照某個 單位 來處理。32位機器,每次處理32位 4位元組的二進位制資料,64位同理。記憶體對齊指的是計算機系統對基本資料型別合法位址做出了一些限制,要求某種型別物件的位址必須是某個值的倍數。本文著重於記憶體對齊的基本原理,有關複雜情況下 虛函式 繼承等 的記憶體對齊方案,...

C C 之記憶體對齊詳情

計算機系統對基本型別資料在記憶體中放的位置做了限制,它們會要求這些數的首位址是乙個數 一般為4和8 的整數倍,我們看下結構體的大小 include struct a int main 結果 1111demacbook pro digui a1111 sizeof size of struct a i...