記憶體變數邊界對齊

2022-08-18 00:09:12 字數 1020 閱讀 8521

一、什麼是記憶體對齊

a)  編譯器按照成員列表的順序給每個成員分配記憶體.

b)  當成員需要滿足正確的邊界對齊時,成員之間用額外位元組填充.

c)  結構體的首位址必須滿足結構體中邊界要求最為嚴格的資料型別所要求的位址.

d)  結構體的大小為其最寬基本型別的整數倍.

1 #include2

3 #include4

5 #include6

7using namespace std;89

struct node1

1011

n1;20

21struct node2

2223

n2;32

33int

main()

3435

view code

實驗顯示結果為

a)    node1和node2的成員相同,但成員的順序不一樣,所以總體占用的空間不一樣,驗證了編譯器按照成員列表的順序給每個成員分配記憶體。

b)   對於node1和node2,分別輸出每個成員的占用空間,發現char c和char b順序緊挨時,各佔據乙個位元組;char a 和char b相隔時,各佔據4個位元組。驗證了當成員需要滿足正確的邊界對齊時,成員之間用額外位元組填充.

c)    實驗表明,記憶體變數是按邊界對齊。

二、為什麼要按邊界對齊

從處理器的角度來看,需要盡可能減少對記憶體的訪問次數以實現對資料結構進行更加高效的操作。為什麼呢?因為儘管處理器包含了快取,但它在處理資料時還得讀取快取中的資料,讀取快取的次數當然是越少越好!如上圖所示,在採用邊界對齊的情況下,當處理器需要訪問a_變數和b_變數時都只需進行一次訪問(圖中花括號表示一次訪問操作)。若不採用邊界對齊,a_變數只要一次處理器操作,而b_變數卻至少要進行兩次操作。對於b_,處理器還得呼叫更多指令將其合成乙個完整的4位元組,這樣無疑大大降低了程式效率。

整數邊界對齊方式 C高階 記憶體對齊

碼字不易,對你有幫助點讚 關注支援一下作者不會程式設計的程式圓看更多乾貨,獲取第一時間更新如果想看比較好看的排版,可以閱讀原文 c高階 四 記憶體對齊 mp.weixin.qq.com 我們這一節主要來講一相關的些比較重要的知識。struct s1 上面是乙個結構體,也是我們自定義的一種型別。我們知...

邊界對齊問題

結構體邊界對齊 許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們會要求這些資料的首位址的值是某個數k 通常它為4或8 的倍數,這就是所謂的記憶體對齊,而這個k則被稱為該資料型別的對齊模數 alignment modulus 當一種型別s的對齊模數與另一種型別t的對齊模數的比值是大於...

變數的記憶體分配 記憶體對齊

資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。include iostream 2using namespace std 34 structx15 1011struct x212 17 18struct x319 24 ...