32vc內(nèi)存對齊準則

32vc內(nèi)存對齊準則

ID:30749649

大?。?3.50 KB

頁數(shù):6頁

時間:2019-01-03

32vc內(nèi)存對齊準則_第1頁
32vc內(nèi)存對齊準則_第2頁
32vc內(nèi)存對齊準則_第3頁
32vc內(nèi)存對齊準則_第4頁
32vc內(nèi)存對齊準則_第5頁
資源描述:

《32vc內(nèi)存對齊準則》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、VC內(nèi)存對齊準則(Memoryalignment)本文所有內(nèi)容在建立在一個前提下:使用VC編譯器。著重點在于:VC的內(nèi)存對齊準則;同樣的數(shù)據(jù),不同的排列有不同的大小,另外在有虛函數(shù)或虛擬繼承情況下又有如何影響?內(nèi)存對齊?!What?Why?對于一臺32位的機器來說如何才能發(fā)揮它的最佳存取效率呢?當然是每次都讀4字節(jié)(32bit),這樣才可以讓它的bus處于最高效率。實際上它也是這么做的,即使你只需要一個字節(jié),它也是讀一個機器字長(這兒是32bit)。更重要的是,有的機器在存取或存儲數(shù)據(jù)的吋候它要求數(shù)據(jù)必須是對齊的,何謂對齊?它要求數(shù)據(jù)的地址從4的

2、倍數(shù)開始,如若不然,它就報錯。還有的機器它雖然不報錯,但對于一個類似int變量,假如它橫跨一個邊界的兩端,那么它將要進行兩次讀取才能獲得這個int值。比方它存儲在地址為2?5的四個字節(jié)中,那么要讀取這個int,將要進行兩次讀取,第一次讀取0?3四個字節(jié),第二次讀取4?7四個字節(jié)。但是如果我們把這個整形的起始地址調(diào)整到0,4,8…呢?一次存取就夠了!這種調(diào)整就是內(nèi)存對齊了。我們也可以依次類推到16位或64位的機器上。邊界該如何調(diào)整對于32位的機器來說,它當然最渴望它的數(shù)據(jù)的大小都是4Byte或者4的倍數(shù)Byte,這樣它就能最有效率的存取數(shù)據(jù),當然如

3、果數(shù)據(jù)小T4Byte,那也是沒問題的。那么編譯器要做的便是盡量滿足這個要求。這兩天我斷續(xù)對VC做了一些實驗,并總結(jié)如下三條準則,你要明白的是這并非來自微軟的官方文檔,但我自以為這些準則或許不全但應(yīng)該都是正確的:?變量存放的起始位置2應(yīng)為變量的大小與規(guī)定對齊量1中較小者的倍數(shù)。例如,假設(shè)規(guī)定對齊量為4,那么char(1byte)變量應(yīng)該存儲在偏移量為1的倍數(shù)的地方,而整形變量(4byte)則是從偏移量為4的倍數(shù)的地方,而double(8byte)也同樣應(yīng)存儲在偏移量為4的倍數(shù)的地方,為什么不是8?因為規(guī)定對齊量默認值為4,而4v8。在VC中默認對齊

4、量為8,而非4。?結(jié)構(gòu)體整體的大小也應(yīng)該對齊,對齊依照規(guī)定對齊量與最大數(shù)據(jù)成員兩者中較小的進行。?Vptr影響對齊而VbcPoint(Virtualbaseclasspointer)不影響。一個實例對于類T:classT{charc;inti;doubled;};將其sizeof輸出后的大小為16,其內(nèi)存布局如圖「變量c從偏移量為0開始存儲,而整形i第一個符號條件的偏移量為4,double型d的第一個符號條件的為8。整個對象的大小為16,不需要再進行額外的對齊。圖T(類T的內(nèi)存布局):charc因?qū)R而填同樣的數(shù)據(jù),不同的大小再看類L,它與T存儲

5、同樣類型的數(shù)據(jù),僅僅是順序不同罷了,那么它sizeof輸出的大小是多少呢?類L:classL{charc;doubled;inti;};它sizeof后的結(jié)果或許會令你大吃一驚,或許不會(如果你有認真讀前面的兩條準則)。Lsizeof后的結(jié)果是24!同樣是一個int,一個char,一個double卻整整多出了8個字節(jié)。這期間發(fā)生了什么?我們依據(jù)前面兩條規(guī)則來看看。C存儲于0的位置,1-7都不能整除8,所以d存儲在8-15,16給i正好合適,i存儲在16?19??偣不ㄙM了20個字節(jié),抱歉不是8的倍數(shù),還得補齊4個?,F(xiàn)在你可以看看圖L的關(guān)于類L的內(nèi)存

6、布局,再比較一下類L和類T的內(nèi)存布局。圖L(類L的布局)charcdoubledinti我得出了這樣一條并不權(quán)威的結(jié)論,因為我還沒聽有人這樣說過:在聲明數(shù)據(jù)成員的時候,將最大字節(jié)數(shù)的變量放在最前面3,切忌不要將大小差距很大的類型交替聲明。Vptr影卩向?qū)R而VbcPoint(Virtualbaseclasspointer)不影響前面的實例只涉及前兩條準則,現(xiàn)在我們來看看第三條的兩個實例:classX{chara;};classY:virtualpublicX{};Y的大小為:a占一個字節(jié),VbcPoint(我稱他為虛基類指針)占四個字節(jié)。我們不論

7、a與VbcPoint的位置如何擺放,如果將VbcPoint等同于一個成員數(shù)據(jù)來看的話,sizeof(Y)都應(yīng)該為8.實際上它是5!就我目前的水平,我只能先將其解釋為VbcPoint不參與對齊。對于vptr這個問題則不存在:classX{chara;virtualintvfc(){};}sizeof(X)的大小確實為8.關(guān)于#pragmapack(n)用#pragmapack(n)改變規(guī)定對齊量試試9。1.規(guī)定對齊量:實際上并沒有這么一個名詞,是我為了方便而造出來的。在VC屮這個“規(guī)定對齊量”會有一個默認值,這個默認值一般為8,我原來一直以為這個值

8、以為是4,至于它為什么為8,我現(xiàn)在還不知道。。我們也可以通過#pargmapack(n)來規(guī)定這個值,目前n可以為1,2,4,8,16。

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。