記憶體對齊是編譯器為了便於cpu快速訪問而採用的一項技術,對於不同的編譯器有不同的處理方法。
win32平台下的微軟vc編譯器在預設情況下採用如下的對齊規則: 任何基本資料型別t
的對齊模數就是t的大小,即sizeof(t)。比如對於double型別(8位元組),就要求該型別資料的位址總是8的倍數
,而char型別資料(1位元組)則可以從任何乙個位址開始。linux下的gcc奉行的是另外一套規則
:任何2位元組大小(包括單位元組嗎?)的資料型別(比如short)的對齊模數是2,而其它所有超
過2位元組的資料型別(比如long,double)都以4為對齊模數。
下面的程式可以驗證:
#include
#define offset(type,member) ((int)(&(((type*)0)->member)))
typedef
struct
sta;
int main()
在vc上的結果是:
而在linux下的結果卻是:
主要是對於double型別,vc採用的是8對齊,而gcc採用的是4對齊
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 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自...