結構體內存對齊和大小端

2021-08-26 09:37:46 字數 2177 閱讀 5731

結構體怎麼對齊?

1.第乙個成員與結構體變數偏移量為0的位址處開始數

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處

注意:對齊數,vs中是8,linux中是4

3.結構體的總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數 )的整數倍

4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的 整數倍處,結構體的整體大小就是所有最大對齊數

(含巢狀結構體的 對齊數)的整數倍

例子:執行環境(vs2013,win10)

//進行整體對齊,最大型別為1《對齊數4,按1整體對齊,所以1+1+1=3

struct x

;//進行整體對齊,最大型別為4=對齊數4,按4整體對齊,1+2<4,所以4+4=8

struct y

;//進行整體對齊,最大型別為4=對齊數4,按4整體對齊,1<4,2<4,所以4+4+4=12

struct z

;//進行整體對齊,最大型別為8>對齊數4,按8整體對齊,1+2<4,所以8+8+8=24

struct k

;

其執行結果如下圖:

巢狀結構體的情況

struct x

;struct y

;

得到y的大小為32

如何讓結構體按照指定的對齊引數進行對齊?

1.使用(# pragma pack())

2.按alt+f7 自行去編譯器設定

例子:

# pragma pack(2)   

struct d;

結構體d的大小為12,2位元組對齊     

為什麼要進行記憶體對齊?

某些位址處取某些特定型別的資料,否則會丟擲硬體異常。

2.效能原因:經過記憶體對齊後,cpu的記憶體訪問速度大大提公升    cpu訪問記憶體就是讀取位元組數的整數倍

如何知道結構體中某個成員相對於結構體起始位置的偏移量?

printf("%d\n",offsetof(a, c));  offsetof,該巨集用於求結構體中乙個成員在結構體中的偏移量。

什麼是大小端?如何測試某台機器是大端還是小端

大小端概念:

例子:

看了這個例子,一定會有這樣的疑問:應該是00 00 00 01,為什麼會是這樣的

vs2013是小端儲存

如何測試大小端

1.利用公用體(聯合union)(常用)

為什麼要用公用體來檢測大小端?這是因為公用體特殊的底層結構,下面是公用體的模型

由圖可以看出:char a和int b公用同一塊空間,我們給b賦1,然後返回a,如果返回值是1,就是小端儲存

2.利用指標

字元型指標每次偏移乙個位元組,利用這個特性可以來檢查大小端

int main()

else

system("pause");

return 0;

}

結構體內存對齊

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

結構體內存對齊

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

結構體內存對齊

對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...