有時會在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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...