寫在前面,博主也是個菜鳥,只是在這裡分享一些自己遇到的問題,如有表述不當的地方請諒解。
關於位元組對齊的問題其實很好理解,只要了解下cpu讀取資料的細節再動手實踐一下就一目了然了,下面是我了解到的cpu讀取資料時的一些細節和實踐的過程。
首先看一下記憶體的排列:
注釋:數字時位址,每格表示一位元組的位址。
理論上可以讀到每乙個位址對應的記憶體區域(也就是可以讀取到每乙個位元組),但是考慮到執行效率實際操作並不是這樣的,而是讀取某一塊兒區域。
下面是為什麼是讀取某一塊兒區域而不是一位元組一位元組的讀:
舉個栗子例如讀取乙個int型資料,
如果是每次讀取乙個位元組的話那麼乙個int型變數就需要讀取四次,並且還要做一些合併的操作,這樣效率就會很低。
所以就需要根據資料型別所佔的位元組大小按塊兒讀取這樣就可以一次就把資料讀取出來,效率將會得到提公升。
在一些考試裡經常會通過結構體考察位元組對齊這部分的知識,我就是在公司筆試時遇到的這個問題所以來這裡做個筆記
typedef
struct _space
space;
space space1;
printf
("位元組:%d\n"
,sizeof
(space1)
);
輸出的結果是這樣的:
不同環境下型別所佔位元組數可能不同,我這裡是char型別佔1位元組int型別是4位元組。
那麼為什麼不是1+4+1=6位元組呢?
答:因為位元組對齊了
我們再來看一下結構體內成員變數的位址
typedef
struct _space
space;
space space1;
printf
("位元組:%d\n"
我們來圖形化一下
因為結構體在記憶體空間裡是按照成員變數的順序儲存的,所以char型變數a要與int型變數b對齊儲存,c同理所以出現了上面的儲存情況。
我們再來交換一下成員變數的順序看一些儲存情況有什麼變化。
typedef
struct _space
space;
space space1;
printf
("位元組:%d\n"
,sizeof
(space1));
printf(,
&(space1.a));
printf(,
&(space1.c));
printf(,
&(space1.b));
return0;
}
輸出結果如下:
再來圖形化一下
到這裡大家應該對位元組對齊有一些了解了。
注意:以後再使用結構體的時候要注意成員變數的排列順序啦,以達到節約記憶體的目的。
typedef
struct _space
space;
typedef
struct _space1
space1
space1 space1;
那麼在這種情況下結構體_space1所占用的儲存空間是什麼情況呢?我們已經知道結構體的成員變數的儲存順序是按照成員變數在結構體內的排列順序儲存的,並且會將兩個連續儲存的char型別變數再記憶體上也連續儲存然後在與int型變數對齊(這裡僅用char型別與int型別舉例其他型別同理),然後我們認為space1.aa應該是與space1.space.a是連續儲存的並且space1.space.c也是與space1.bb連續儲存的從而得到變數space所佔的儲存空間為12位元組但是不是這樣的。
我是這樣理解的space1是乙個space型別的變數如果將space1.aa和space1.space.a連續儲存的話那麼在讀取space1.space時就會將space1.aa一併讀取出來,這樣就又回到了為什麼需要位元組對齊的問題上。
表述上可能有些問題,望諒解!!
關於位元組對齊的一些理解
1 基本資料對齊 在x86,32位系統下基於microsoft borland和gnu的編譯器,有如下資料對齊規則 a 乙個char 占用1 byte 變數以1 byte對齊。b 乙個short 占用2 byte 變數以2 byte對齊。c 乙個int 占用4 byte 變數以4 byte對齊。d ...
關於c 中記憶體對齊的一些問題
假設有以下 include include class a class b int main 原始碼檔案為test.cpp,在64位機器上編譯執行 g test.cpp o test test int是4個位元組,short2個位元組,char1個位元組,理論上a因該是4 2 2 1 11個位元組啊...
關於面試的一些問題
面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...