出處:
我們現在使用的算機中記憶體空間都是按照位元組(byte)劃分的,理論上說,似乎對任何型別的變數的訪問可以從任意位址開始,但實際情況則是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別的資料按照一定的規則在記憶體空間上排列,而不是順序的乙個接乙個地排放,這就是對齊。
資料型別的自身對齊值:其在記憶體中所佔的位元組數,如在32位系統中,char為1位元組,short為2位元組,int、float、double、long為4位元組。
結構體或類的自身對齊值:其成員中自身對齊值最大的那個值。
結構體或類的預設對齊值為其成員中自身對齊值最大的那個值。
使用#pragma pack(value)時指定的值value。
結構體和類的有效對齊值為:沒有指定對齊值時為預設對齊值和自身對齊值的最小值;當指定了對齊值後為指定對齊值和自身對齊值的最小值。
在編碼時,我們可以這樣動態修改編譯器的對齊值:
1)修改預設對齊值,指定新的記憶體對齊值:
#pragma pack(value)
2)取消指定的記憶體對齊值,恢復預設對齊值:
#pragma pack()
對於乙個結構體,不但需要對其每個成員變數進行記憶體位址對齊,還要對結構體本身進行對齊。具體規則是:在假設結構體起始位址為
0x0000
的情況下,要求各成員變數的起始位址必須是其相應
有效對齊值
的整數倍
,並要求結構體的大小也為該結構體有效對齊值的整數倍。
例4.1:
[cpp]view plain
copy
struct
a ;
則該結構體所佔的記憶體位元組數sizeof(struct a) = 8;
具體分析如下:
故該結構體及其成員變數的有效對齊值為編譯器預設對齊值和其自身對齊值的最小值:
int a 的自身對齊值為4
char b 的自身對齊值為1
short c 的自身對齊值為2
struct a 的自身對齊值為max(4,1,2) = 4
編譯器預設對齊值為各成員變數自身對齊值中的最大值,即為4。
故 int a 的有效對齊值為min(4,4) = 4
char b 的有效對齊值為min(1,4) = 1
short c 的有效對齊值為min(2,4) = 2;
struct a 的有效對齊值為min(4,4) = 4
假設結構體a從位址空間0x0000開始排放。由上面的計算可知,第乙個成員變數int a的有效對齊值為4,所以其存放的位址為0x0000~0x0003,且其起始位址0x0000符合0x0000%4 = 0;第二個成員變數char b的有效對齊值為1,所以其存放位址為0x00004,且其起始位址0x0004符合0x0004%1 = 0;第三個成員變數short c 的有效對齊值為2,所以其存放位址應該為0x0006~0x0007,而其起始位址0x0006也符合0x0006%2 = 0;
最後還要對整個結構體進行記憶體位址對齊:即要保證整個結構體的大小應該為其有效對齊值的整數倍,而該結構的有效對齊值為4,現在三個成員變數已經佔據了0x0000~0x0007共8個位元組的記憶體空間,而8%4 = 0也符合對齊要求,故整個結構體的大小應該為8.
例4.2
[cpp]view plain
copy
#pargma pack(8)
struct
a ;
struct
b ;
#pargma pack()
分別求出sizeof(struct a)和sizeof(struct b)的值。
類似例4.1可分析:
sizeof(struct a)= 8,sizeof(struct b)= 16
找工作筆試面試補充基礎知識 1 記憶體對齊
出處 我們現在使用的算機中記憶體空間都是按照位元組 byte 劃分的,理論上說,似乎對任何型別的變數的訪問可以從任意位址開始,但實際情況則是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別的資料按照一定的規則在記憶體空間上排列,而不是順序的乙個接乙個地排放,這就是對齊。資料型別的...
面試基礎知識補充
1.往記憶體中讀資料是輸入流,從記憶體中往外寫是輸出流。2.根據處理的資料型別分為位元組流和字元流 3.位元組流可以處理所有資料型別的資料。字元流處理文字資料 檔案操作 file.exists 是否存在 file.getabsolutepath 絕對路徑 file.length 檔案大小 file....
python基礎知識 (筆試) day1
1.對映是一種關聯式的容器型別,它儲存了物件與物件之間的對映關係,字典是python裡唯一的對映型別,它儲存了鍵值對的關聯,是由鍵到鍵值的對映關係。2.在python中,使用open方法開啟檔案,語法如下 open 檔名,訪問模式 b 二進位制模式 r 唯讀,指標將會放在檔案的開頭 rb 二進位制唯...