目錄
計算機裡面記憶體的資料儲存結構以及為什麼要邊界對齊
行邊界儲存
結構的儲存分配規則:
資料的大小端問題
參考文獻
計算機裡面的從主存的是有乙個個基本的儲存單元構成了,每個儲存單元儲存的二進位制數叫做儲存字長
目前一般的儲存字長都是64位。同時計算機的主存都是按照位元組編址,同時一般來說計算機的cpu只能訪問偶數的位址
這種問題,造成了計算機的儲存邊間的問題。
如圖所示,如果資料的儲存都是緊緊密密的,節約儲存空間,那麼有可能有些位址無法再某些cpu無法訪問,或者是訪問需要多次然後進行拼接而成。或者是跨越兩個儲存單元就進行拼接而成乙個資料。
本來cpu就比主存要快很多,如果由於資料的讀取問題更讓cpu浪費更多的時間,顯然是不合理的。
那麼為了減少訪問次數和平衡空間問題。就要進行邊界儲存
如圖所示,空白的部分的位址是空的,沒有利用上。確保每個資料的位址都是偶數的,同時盡量跨越少的儲存單元。
1,編譯器按成員列表的順序為每個成員分配記憶體
2,結構的起始儲存位置為該結構中邊界對齊要求最嚴格的資料型別所要求的位置
3,第乙個成員存放在偏移量為0的位置;接下來的各成員存放在偏移量為該成員的型別所佔位元組數的整數倍的位置;特別地,當成員為結構時,該結構成員存放在偏移量為該結構成員內佔空間最大的成員所佔位元組數的整數倍的位置
4,結構大小為該結構中占用空間最大的成員的所佔位元組數的整數倍
基於以上規則,我們使用下述做法來減少因邊界對齊帶來的空間損失:結構中,讓對邊界對齊要求嚴格的成員先出現,對邊界對齊要求弱的成員後出現
#pragma pack (n):指定對齊值為n(對齊值最多為n)
#pragma pack ():取消自定義對齊值
gcc編譯器的預設對齊值:4位元組
sizeof操作符可以得到結構的大小
使用stddef.h中定義的offsetof巨集來獲得結構中某成員的偏移量
offsetof(type, member) 結果為乙個 size_t值
eg:某計算機儲存器按位元組編址,採用小端方式存放資料,假定編譯器規定int和short型長度分別為32位和16位,並且資料按邊界對齊儲存,其c語言程式段如下:
如果資料結構修改一下:
所以要先把對齊要求嚴格的先安排,也就是位元組數短小的先安排了。
資料儲存的時候,有個大小端的問題,也就是乙個多位元組的資料比如所int 的我是先放高8位的資料,還是先放置最低8位的資料
如圖所示,int number=0x0123
儲存位元組對齊
什麼是位元組對齊,為什麼要對齊?tragicjun 發表於 2006 9 18 9 41 00 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空...
關於資料對齊和儲存器讀寫
資料對齊是跟資料在記憶體中的位置相關的話題。如果乙個變數的記憶體位址正好是他長度的整數倍,那麼它就叫做自然對齊。舉例來說,乙個32位的整型資料,如果他在記憶體中的位址剛好可以被4整除,我們就說這個整型數是自然對齊的。在編譯過程中,可以通過編譯器來調整資料對齊。一般在預設情況下,對於標準資料型別來說,...
結構體儲存記憶體對齊
解析c語言結構體對齊 記憶體對齊問題 結構體對齊原因有很大部分是因為計算機掃瞄的記憶體單元個數,也就是資料匯流排的大小。原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如i...