第二條規則:vs下用#progma pack(n)用來設定記憶體對齊的係數,每次將要對齊的資料成員長度和n來比較,小的那個乙個作為標準來對齊。第三條規則:將所有資料成員對齊之後,整個class或者struct也要進行對齊,它的大小必須是這個類中所佔位元組最大的資料成員的位元組的整數倍數-
接下來我將使用幾個例子來詳細解釋記憶體對齊的三條規則是怎麼使用的。
例子1:
#include
using
namespace
std;
class a
;int main()
這是記憶體分配的示意圖:
我們來將**一步一步分析:
class
a;
例子2:
**:
#include
using
namespace
std;
class b
;int main()
記憶體布局:
我們來將**一步一步分析:
#include
using
namespace
std;
class b
;int main()
總結:用progma pack(n)可以強制設定你想要的記憶體對齊的比較係數,如果你設定為1的話,就是所有的成員都緊湊的貼在一起,不會有空隙,而如果n設定為16,比所有的資料成員的字元大小都大,那麼永遠都不會以n為對齊係數。
如果還有不懂的地方,可以交流一下。
C 深陷 之「記憶體對齊」
現代計算機在處理資料時,按照某個 單位 來處理。32位機器,每次處理32位 4位元組的二進位制資料,64位同理。記憶體對齊指的是計算機系統對基本資料型別合法位址做出了一些限制,要求某種型別物件的位址必須是某個值的倍數。本文著重於記憶體對齊的基本原理,有關複雜情況下 虛函式 繼承等 的記憶體對齊方案,...
編譯之 記憶體對齊
現代計算機中記憶體空間都是按照 byte 劃分的,也就是位元組,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊 從cpu的角度來說,cpu...
C語言結構體之記憶體對齊
首先看乙個例子,下面有乙個結構體 struct structtest1 假設這個結構體成員在記憶體中是緊湊排列的,那麼c1的儲存位址就是0,s的儲存位址是1 2,c2的儲存位址是3,i的儲存位址是4 7,c1的位址是0000000000000000,s的位址是0000000000000001,c2的...