C C 記憶體位元組對齊詳解

2021-07-04 19:53:15 字數 1384 閱讀 8255

from 

例1

#include "stdafx.h"

#include using namespace std;

struct a

;struct b //換乙個順序

;int main()

其輸出結果為:

24[換行] 

16 ,不同樣結構體包含相同的元素型別,為什麼得到的長度不相同呢?這就 牽扯到

資料對齊

1. 什麼是資料對齊?

線代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的儲存與訪問都可以從任何位址開始,但是實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要給型別資料按照一定的規劃在空間上排列,而不是順序的乙個個排列,這就是對齊。

2.對齊方式

就上面的例子來說,對齊方式為:我們的平台預設的對齊長隊為4個位元組,那麼其對齊方式分別如下:

上圖即是記憶體對齊的解析,為什麼兩種對齊方式不一樣呢?我們的平台預設對齊長度為4個位元組

3. 自定義對齊長度

在vc中,我們可以用pack預處理來禁止對齊調整,下面的**使得結構更加緊湊:

#include "stdafx.h"

#include using namespace std;

#pragma pack(2) /*指定按2位元組對齊*/

struct c ;

#pragma pack() /*取消指定對齊,恢復預設對齊*/

int main()

執行結果為:16,因為我們設定對齊長度為2個位元組,在結構體中,char自身對齊長度為1個位元組,1 < 設定長度2,所以char的有效對齊長度為1個位元組,第0號記憶體存放char,第二個變數long,自身對齊長度為4個位元組,但是4 > 2, 所以有效對齊長度為2個位元組,存放位址從第2號開始,因為第1號記憶體1%2=1而不等於0,所以從第2號記憶體開始,一直到第5號記憶體結束,第6號記憶體存放char元素,接下來的double 自身對齊長度為8個位元組,但是8>2,所以有效長度為2,因為7%2=1(不等於0),所以從第8號記憶體開始儲存double元素,一直到第15號記憶體,所以結構體c占用16個位元組。

我們得到在結構體或者類中,有效對齊長度是 自身對齊長度與設定對齊長度中較小的那乙個

1. 程式設計師面試寶典

2. 資料對齊詳解 

bakari

記憶體對齊之主文 C C 位元組對齊詳解

發表於2010 年 09 月 05 日 由linuxsong 一.什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則...

C C 位元組對齊詳解

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

C C 位元組對齊詳解

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