乙個類的物件到底有多大?其大小由什麼因素影響?
我們假定這個類沒有繼承任何其他類,且沒有虛函式。先看下面例子:
#include
using namespace std;
class concrete
private:
int val;
char c1;
char c2;
//char c3;
};
int main(void)
執行上面的程式,不管是否有成員變數
c3,輸出結果均為
8,為什麼呢?
由於記憶體的
alignment
的原因,所有物件的大小為
4bytes
的整數倍
(因為其資料成員的資料型別最大占用位元組數為4,即
sizeof(int val) = 4)
,不足的就填充,如下面的圖示。
(有成員變數
c3的情況
)(沒有成員變數
c3的情況)
出現在
derived class
中的base class subobject保持其完成原樣性
請看下面例子:
#include
using namespace std;
class concrete1
};
class concrete2 : public concrete1
};
class concrete3 : public concrete2
};
int main(void)
輸出會是多少呢?類
concrete3和1)
中的類concrete
完成的功能一模一樣,但是
concrete3
的物件的空間確變成了
16bytes
,比原來的整整多出一倍!原因就是
c++語言保證「出現在
derived class
中的base class suboject
有其完整性」。**如下:
在上圖中
concrete2
型別的物件中,為什麼也要填充
3bytes
呢?這還是因為繼承了
concrete1
的緣故。正是因為繼承了
concrete1
中的int val
,因此concrete2
的對齊數變成了
4 bytes
,因此必須要填充
3 bytes
。總結如下:
其一,c++
語言保證「出現在
derived class
中的base class suboject
有其完整性」;
其二,derived class
的對齊數
= min(
指定的全域性對齊數,
max(base class
的對齊數,
derived class
的對齊數))
**
關於記憶體對齊
資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...
關於記憶體對齊
早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...
關於記憶體對齊
資料傳送到網路板的資料報大小根本不是實際控制資料報的大小 這時我才想起乙個人,stanley b.lippman,他寫的那一本書 inside object modale 曾經提過這樣的事情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上對 s...