1.平台原因:
資料結構(尤其是棧)應該盡可能的的在自然邊界上對齊。(原因:為了訪問未對齊的記憶體,處理器需要倆次訪問操作;而對齊的記憶體則只需要一次)
其實從本質上來說:這是一種以空間換取時間的做法
32位cpu預設對齊數為4;64位cpu預設對齊數字8
(vs下預設對齊數是8,linux下沒有預設對齊數)
1.結構體的第乙個成員永遠都對齊到結構體的起始位置處;
2.之後的每乙個成員都要放在與自己型別大小相符和的整數倍處;
3.如果出現巢狀了結構體的情況,那巢狀的結構體就對齊到自己成員中最大對齊數的整數倍處開始對齊;
4.結構體的大小一定是自己做大對齊數的整數倍;
5.如果結構體內有成員大小超過預設對齊數大小,則後邊的仍然按照預設對齊數來參考對齊。
#include
struct s
;typedef
struct student
stu;
int main()
這是在vs下測試的結果;其記憶體排布規則如下圖:
//括號內的數字便為修改後的預設對齊數
eg:#pragma pack(8);
//將預設對齊數設定為8
若括號內沒有填入數字則表示:取消設定的預設對齊數,還原為系統預設的對齊數。
注意:設定預設對齊數時盡量將其設定為2的整數倍。
在設計結構體時,盡量地將小的成員放在一起。
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...
結構體內存對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...
結構體內存對齊
對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...