字節對齊

現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經常在特定的內存地址訪問,這就需要各類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數據只能從某些特定地址開始存取。

通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標平臺的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定數據的對齊方法。 但是,正因爲我們一般不需要關心這個問題,所以因爲編輯器對數據存放做了對齊,而我們不瞭解的話,常常會對一些問題感到迷惑。最常見的就是struct數據結構的sizeof結果,出乎意料。

編譯器中提供了#pragma pack(n)來設定變量以n字節對齊方式。


測試程序:

#include <stdio.h>

#pragma pack(push, 1)


typedef struct student_info
{
char name;
int sex;
double score;
}stu_t;


#pragma pack(pop)


int main( )
{
int len;
len = sizeof(stu_t);
printf("struct student_info len:%d\n",len);
return 1;
}

輸出結果爲:struct student_info len:13

若不加#pragma pack(push, 1)與#pragma pack(pop),輸出結果爲:struct student_info len:16。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章