gcc 記憶體對齊

2021-06-28 20:36:02 字數 2032 閱讀 9694

cpu以位元組為單位編址,而c語言指標以指向的資料型別長度作自增和自減。

gcc下的double的alignment-requirement

在用編譯選項-malign-double的時候,double的alignment-requirement是雙字(32位機器上就是8),用-mno

-align-double的時候,double的alignment-requirement是單字。在我的機器上沒所有選項的時候double的

alignment-requirement是單字。

這個編譯選項只針對i386和x86-64,並且對long double和long long資料型別也適用。

struct test_t ;

首先我們首先確認在試驗平台上的各個型別的size,經驗證兩個編譯器的輸出均為:

sizeof(char) = 1

sizeof(short) = 2

sizeof(int) = 4

我們的試驗過程如下:通過#pragma pack(n)改變「對齊係數」,然後察看sizeof(struct test_t)的值。

1、1位元組對齊(#pragma pack(1))

輸出結果:sizeof(struct test_t) = 8 [兩個編譯器輸出一致]

分析過程:

1) 成員資料對齊

struct test_t ;

成員總大小=8

2) 整體對齊

整體對齊係數 = min((max(int,short,char), 1) = 1

整體大小(size)=(成

員總大小

)按(整體對齊係數) 圓整 = 8 /* 8%1=0 */ [注1]

2、2位元組對齊(#pragma pack(2))

輸出結果:sizeof(struct test_t) = 10 [兩個編譯器輸出一致]

分析過程:

1) 成員資料對齊

struct test_t ;

成員總大小=9

2) 整體對齊

整體對齊係數 = min((max(int,short,char), 2) = 2

整體大小(size)=(成

員總大小

)按(整體對齊係數) 圓整 = 10 /* 10%2=0 */

3、4位元組對齊(#pragma pack(4))

輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員資料對齊

struct test_t ;

成員總大小=9

2) 整體對齊

整體對齊係數 = min((max(int,short,char), 4) = 4

整體大小(size)=(成

員總大小

)按(整體對齊係數) 圓整 = 12 /* 12%4=0 */

4、8位元組對齊(#pragma pack(8))

輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員資料對齊

struct test_t ;

成員總大小=9

2) 整體對齊

整體對齊係數 = min((max(int,short,char), 8) = 4

整體大小(size)=(成

員總大小

)按(整體對齊係數) 圓整 = 12 /* 12%4=0 */

5、16位元組對齊(#pragma pack(16))

輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員資料對齊

struct test_t ;

成員總大小=9

2) 整體對齊

整體對齊係數 = min((max(int,short,char), 16) = 4

整體大小(size)=(成

員總大小

)按(整體對齊係數) 圓整 = 12 /* 12%4=0 */

gcc 的記憶體對齊

cpu以位元組為單位編址,而c語言指標以指向的資料型別長度作自增和自減。gcc下的double的alignment requirement 在用編譯選項 malign double的時候,double的alignment requirement是雙字 32位機器上就是8 用 mno align do...

struct記憶體對齊 gcc與VC的差別

記憶體對齊是編譯器為了便於cpu快速訪問而採用的一項技術,對於不同的編譯器有不同的處理方法。win32平台下的微軟vc編譯器在預設情況下採用如下的對齊規則 任何基本資料型別t 的對齊模數就是t的大小,即sizeof t 比如對於double型別 8位元組 就要求該型別資料的位址總是8的倍數 而cha...

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...