結構體的記憶體對齊實際上是硬體工程師的事,但是由於筆試經常考,而且我們在實際專案中由於設定的對齊方式不對曾經導致過在不同機器上不能移植的問題。所以有必要了解一下。
1.為什麼需要記憶體對齊:因為計算機一次處理資料的單元不是位元組,而是塊。(即1 2 4 8 16位元組)
2.struct是怎樣進行記憶體布局的;
總體來說就是,某一中型別要在其尺寸大小整數倍的位址上放置,最後乙個變數要補充空位(為了方便快速的實現這種結構體的陣列)。
常用位元組數(32位機):
int 乙個字 32位,4位元組
short 半個字 16位,2位元組
long 乙個字 32位,4位元組
char 1位元組
float 乙個字 32位 ,4位元組
double 兩個字 64位, 8位元組
看如下幾個結構體的記憶體布局:
1. typedef struct ms1
ms1;
記憶體布局為:1+3+4=8
_______________________________________
| |\\\\\\\\\\\| |
| a |\\padding\\| b |
| |\\\\\\\\\\\| |
+-------------------------------------+
bytes: 1 3 4
2. typedef struct ms2
ms2;
記憶體布局為:4+1+3=8;後面的3是填充位元組。填充的長度是使得滿足整體長度能夠整除最大成員變數長度。即8/4。
3. typedef struct ms3
char a;
short b;
double c;
}ms3
記憶體布局為:1+1+2+4+8=16。short是2 所以1+1,得到的結果必須能被2整除。double是8,剩下的4個位元組放不下,必須填充4個位元組,這樣1+1+2+4才是8的倍數,然後放入。
4. typedef struct ms4
char a;
ms3 b;
記憶體布局為: 1+7+16=24。b的最大成員變數是8,所以前面要填充7個位元組。
如果要知道詳細的情況,參考
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 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自...