#include
#include
using namespace std;
class point
;
int main()
#include
#include
using namespace std;
class point
;int main()
結果輸出如下:
出人意料的,這兩行語句
cout << sizeof(p) << endl;
cout << sizeof(p.x) + sizeof(p.y) + sizeof(p.z) << endl;
的輸出內容為:129
4 + 4 + 1 = 12 ,這是什麼原因?
解釋這種原因的答案是「位元組對齊」。乙個c++的類的物件或結構體中含有若干成員,其佔占用的總空間不見得正好就是字長(32位機上為4個位元組)的整數倍,為了程式執行的效率,編譯器在一定的設定下可能對裡面的成員排放位置做一些調整,使得整個結構體的大小為乙個字長的整數倍,這就是所謂對齊。所以如上的 point 的記憶體布局可能如下圖:
「位元組對齊」盡量使每個資料成員存放在乙個完整的字裡面,譬如:乙個4位元組長的整數,會被存放在乙個完整的字裡面,而不會拆成兩半。既然存在「位元組對齊」,設計**的時候就要考慮到這些問題,譬如:
class point1
;
class point2
;
cout << sizeof(point1) << endl;
cout << sizeof(point2) << endl;
point1 p1;
cout << "&p1.x:" << &p1.x << endl;
cout << "&p1.y:" << &p1.y << endl;
cout << "&p1.m:" << (void *)&p1.m << endl;
cout << "&p1.n:" << (void *)&p1.n << endl;
point2 p2;
cout << "&p2.x:" << &p2.x << endl;
cout << "&p2.m:" << (void *)&p2.m << endl;
cout << "&p2.y:" << &p2.y << endl;
cout << "&p2.n:" << (void *)&p2.n << endl;
class point1
;class point2
;cout << sizeof(point1) << endl;
cout << sizeof(point2) << endl;
point1 p1;
cout << "&p1.x:" << &p1.x << endl;
cout << "&p1.y:" << &p1.y << endl;
cout << "&p1.m:" << (void *)&p1.m << endl;
cout << "&p1.n:" << (void *)&p1.n << endl;
point2 p2;
cout << "&p2.x:" << &p2.x << endl;
cout << "&p2.m:" << (void *)&p2.m << endl;
cout << "&p2.y:" << &p2.y << endl;
cout << "&p2.n:" << (void *)&p2.n << endl;
結果輸出如下:
我們分別對point1 和 point2 作圖演示出這種布局的差異。可以看出,同樣的資料成員,不同的排列方式會引起類的長度的差別,大家在寫**的時候一定要考慮到這一點。
point1 如下:
point2 如下:
C 類中的位元組對齊
結果輸出如下 出人意料的,這兩行語句 cout sizeof p endl cout sizeof p.x sizeof p.y sizeof p.z endl 的輸出內容為 129 4 4 1 12 這是什麼原因?解釋這種原因的答案是 位元組對齊 乙個c 的類的物件或結構體中含有若干成員,其佔占用...
C 中位元組對齊以及位元組對齊的意義
對下面的類 class b 類b 物件的大小,如果直接計算是18 4 2 8 4 但是 sizeof b 結果是24。多出來的 6個位元組是怎麼回事呢?其實是記憶體對齊的原因。編譯器在預設的情況下,分配給各個成員變數的記憶體大小似乎是向佔最大空間的成員變數對齊的 這裡我不敢肯定,還沒看到權威的說法 ...
C 中的位元組對齊
本部落格 位元組對齊 1.基本概念 位元組對齊 計算機儲存系統中以byte為單位儲存資料,不同資料型別所佔的空間不同,如 整型 int 資料佔4個位元組,字元型 char 資料佔乙個位元組,短整型 short 資料佔兩個位元組,等等。計算機為了高速的讀寫資料,預設情況下將資料存放在某個位址的起始位置...