預設條件下,記憶體對齊是以class/struct中最大的那個基本型別為基準的(x倍數)
如果在類的前面有
#pragma pack(n)
min(#pragma pack(n), 最大長度的型別)
結構體的總大小為 有效對齊值 的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
class c
;// 有效對齊值:8
class c
; // 有效對齊值:4
class c
; // 有效對齊值:1
class c
; // 有效對齊值:2
#pragma pack(2)
class a
;
記憶體對齊的原因:
2.硬體原因:如果不對齊,可能要取好幾次
記憶體對齊規則
1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬 件平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問 未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次...
記憶體對齊規則
隔了很久,搞忘了對齊的規則,現在重新複習了下,記下來謹防以後又忘記。1 可以根據 pragma pack 設定對齊係數,且叫為n 2 結構體中,對比每個成員變數自身的大小和n的大小。取小的個為標準,把這個小的叫a吧,稱為按a對齊 3 每個變變數的起始位址需要為a的整數倍,不是整數倍的則補齊。4 最後...
記憶體對齊的規則
對於cpu從記憶體讀取資料,並不是我們想象的那樣,直接前去讀取對應的大小,為了提公升效率和速度,cpu會按照記憶體讀取粒度的大小來讀取內從中的資料,比如說如果記憶體讀取粒度是4個位元組,那麼cpu會一次讀取4個位元組的記憶體,就算讀取char型別的資料,雖然它只佔1個位元組,但是cpu依然會讀取4個...