結構體怎麼對齊?
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
;
巢狀結構體的情況
得到y的大小為32struct x
;struct y
;
如何讓結構體按照指定的對齊引數進行對齊?
1.使用(# pragma pack())
2.按alt+f7 自行去編譯器設定
例子:
結構體d的大小為12,2位元組對齊# pragma pack(2)
struct d;
為什麼要進行記憶體對齊?
某些位址處取某些特定型別的資料,否則會丟擲硬體異常。
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的...