內(nèi)存條的作用 內(nèi)存對齊的目的和規(guī)則?
內(nèi)存對齊的目的和規(guī)則?有四種內(nèi)存對齊原則:1)。數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個數(shù)據(jù)成員存儲的起始位置從該成員大小或其子成員大小的整數(shù)倍開始
內(nèi)存對齊的目的和規(guī)則?
有四種內(nèi)存對齊原則:
1)。數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(或聯(lián)合)的數(shù)據(jù)成員。第一個數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個數(shù)據(jù)成員存儲的起始位置從該成員大小或其子成員大小的整數(shù)倍開始(只要該成員有子成員,如數(shù)組、結(jié)構(gòu)等)(例如,在32位計算機(jī)中int為4字節(jié),則應(yīng)從4的整數(shù)倍地址開始存儲)?;绢愋筒话╯truct/class/Uinon。
2)如果結(jié)構(gòu)體中有整數(shù)倍,例如char,B,則結(jié)構(gòu)體中應(yīng)該有整數(shù)倍。
3) . 收尾工作:結(jié)構(gòu)的總尺寸,即sizeof的結(jié)果,必須是結(jié)構(gòu)內(nèi)部最大構(gòu)件的“最寬基本型構(gòu)件”的整數(shù)倍。彌補(bǔ)不足。(基本類型不包括struct/class/Uinon)。
4) . sizeof(Union),結(jié)構(gòu)中最大的元素是Union的大小,因為在特定時間,只有Union的一個成員實(shí)際存儲在地址中。
為什么C/C 編程語言經(jīng)常會提到對齊?對齊到底是什么,為什么要對齊,對齊有什么好處?
內(nèi)存對齊是硬件問題,而不是C/C問題本身。只有C/C能夠直接操作內(nèi)存指針,才有可能對其進(jìn)行優(yōu)化。
嚴(yán)格來說,對齊甚至不是CPU問題,而是MMU(內(nèi)存/緩存)問題。
簡而言之,對齊有助于提高緩存利用率。緩存設(shè)計時,每行都是一個對齊的空間,如32字節(jié)。使用他們的地址低索引。如果讀寫到與當(dāng)前緩存線不匹配的地址,則會導(dǎo)致寫回并重新加載緩存線。換句話說,有一個性能成本。此外,如果你熟悉芯片設(shè)計,你會知道成本是驚人的。許多軟件工程師可能沒有意識到,在大多數(shù)情況下,CPU只有很少的時間來執(zhí)行指令,而大部分時間是等待緩存。
因此,對于具有性能優(yōu)化要求的程序,在大多數(shù)情況下,內(nèi)存優(yōu)化是首要任務(wù)。不對齊的內(nèi)存訪問很容易導(dǎo)致此時一次刷新兩個緩存,很有可能有用的數(shù)據(jù)會從緩存中沖出,這不僅增加了此操作的成本,更重要的是,下次必須重新加載清洗后的數(shù)據(jù),這是一個很高的成本。更糟糕的是,此操作可能會繼續(xù)導(dǎo)致新的有用數(shù)據(jù)在下次被刷新和回收。
據(jù)我觀察,今天99%的程序員對CPU內(nèi)存體系結(jié)構(gòu)知之甚少,他們的代碼幾乎根本不考慮性能。事實(shí)上,在大多數(shù)情況下這并不重要。不管怎樣,剩下的1%做了核心工作。