雖然記憶體對齊之前一直都有了解,但讓我總結我一直總結不出來,所以小結一下
乙個變數的相對首位址的偏移要為變數大小的倍數,如int變數偏移只能在0,4,8,12這些位址上。char的倍數為1所以可以在任意位址。
結構體的對齊值是其成員的最大對齊值。
編譯器可以設定乙個最大對齊值,怎麼型別的實際對齊值是該型別的對齊值與預設對齊值取最小值得來。
alignof可以檢視資料型別的對齊值,alignas可以設定型別的對齊值。
#include
using namespace std;
//自定義的colorvector,對齊到32位元組的邊界
struct alignas(32)colorvector
;int main(
)
執行後,我們會得到如下結果:
c++ alignof(colorvector): 32
正如我們所看到的,指定資料colorvector對齊到32位元組的位址邊界上,只需要宣告alignas(32)即可。 記憶體對齊原則
一 記憶體對齊的原因 1 平台移植原因 不是所有的硬體平台都能任意訪問任意位址上的資料,有些硬體平台只能在某些特定位址處讀取特定的資料,否則會丟擲硬體異常 2 效能原因 資料結構 尤其是棧 應盡可能的在自然邊界對齊。原因在於,訪問未對齊的記憶體,處理器需要進行兩次訪問,而訪問對齊的記憶體,處理器只需...
記憶體對齊原則
首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...
記憶體對齊原則
includeusing namespace std struct a struct b int main cout 以上結構體變數數量型別相同。但是sizeof卻不同,sizeof a is 12 sizeof b is 8 那麼問題來了,為什麼兩個一樣的結構體,但是sizeof大小卻不同?答案就...