C C 記憶體對齊

2021-06-29 00:40:57 字數 2103 閱讀 8175

有時會在c/c++中看到這種形式

#pragma pack(n)

#pragma pack()

前一句代表設定對齊的位元組數為n,而不是編譯器預設的對齊位元組數(ubuntu 14.04 x86_64下為8),後一句代表恢復預設值,合理地使用記憶體對齊能減少程式占用的記憶體空間,使用不當也會降低訪問效率從而降低程式效能。在分析記憶體對齊時,只需要採用以下的原則,這裡以一段**簡單解釋下

#include 

#include

int main()

m; char b;

};printf("default_pack_struct_size_bigger:%d\n",(int)sizeof(struct default_pack_struct_size_bigger));

//struct成員位元組數都小於pack,按位元組數最大的對齊=>4

struct default_pack_struct_size_smaller ;

printf("default_pack_struct_size_smaller:%d\n",(int)sizeof(struct default_pack_struct_size_smaller));

//設定pack為4

#pragma pack(4)

//結構成員有大於4位元組的 => 12

struct pack_4_struct_size_bigger ;

printf("pack_4_struct_size_bigger:%d\n",(int)sizeof(struct pack_4_struct_size_bigger));

//結構成員都小於4位元組 => 4

struct pack_4_struct_size_smaller ;

printf("pack_4_struct_size_smaller:%d\n",(int)sizeof(struct pack_4_struct_size_smaller));

#pragma pack()

return

0;}

結果:

另外,在對位域操作時有位序的概念,對於小端的機器(通常x86都是)來說,位序與端序是一致的,即對於低位放在高記憶體位址(當然這個是假定的乙個位元組內的高位,記憶體定址一般是以位元組為單位的)

下面是一段測試程式:

#include 

#include

#include

typedef

struct teststruct;

void teststructendian()

; fprintf(stdout, "sizeof teststruct : %ld\n", sizeof(teststruct));

fprintf(stdout, "%p\n", &t.a);

fprintf(stdout, "%p\n", &t.b);

}void testint()

// 小端情況下,對於位域和位元組一樣也是低線性位址存放內容二進位制的低位

// 測試下大端的情況?

typedef

struct bitfield;

void testbitfield()

// 0 : little endian

// 1 : big endian

int checkendian()

u; u.a = 1;

return u.b == 1 ? 0 : 1;

}int main(int argc, char *argv)

輸出:

sizeof

teststruct : 8

0x7fff2d59d790

0x7fff2d59d794

12345678

sizeof

bitfield

:433323130

a:-16,b

:1endian

:0

C C 記憶體對齊

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

C C 記憶體對齊

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

C C 記憶體對齊

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