1)C++对象大小计算
生活随笔
收集整理的這篇文章主要介紹了
1)C++对象大小计算
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++對象的大小不同的編譯器的實現(xiàn)是不一樣的,以下僅討論.net2003,其他編譯的可能出現(xiàn)的結(jié)果以下也做了分析和猜測。在反推不同編譯器實現(xiàn)的C++對象的大小時。對齊是一個很重要也容易被遺忘的問題。
virtual ji(){};
};
//虛函數(shù)表的指針vptr,只有類中出現(xiàn)虛函數(shù)才會出現(xiàn),它指向虛函數(shù)表,所有虛函數(shù)的地址存放在此表中。
//4(int)+4(int)+4(vptr)=12從中看出,不管有多少虛函數(shù),大小不變,因為類中之保存虛函數(shù)表。
//不管成員函數(shù)有多少,類大小也不變,因為他們不保存在對象中,無論是否是靜態(tài)
int main(){
cout <<"A "<<sizeof(A)<<endl;
cout <<"B "<<sizeof(B)<<endl;
cout <<"C "<<sizeof(C)<<endl;
cout <<"D "<<sizeof(D)<<endl;
cout <<"E "<<sizeof(E)<<endl;
cout <<"F "<<sizeof(F)<<endl;
cout <<"G "<<sizeof(G)<<endl;
cout <<"H "<<sizeof(H)<<endl;
cout <<"I "<<sizeof(I)<<endl;
cout <<"J "<<sizeof(J)<<endl;
cout <<"K "<<sizeof(K)<<endl;
cout <<"L "<<sizeof(L)<<endl;
}
/*******************************************************************/ output .net2003
A 1
B 4
C 4
D 8
E 4
F 8
G 16
H 16
I 24
J 24
K 12
L 12
- class A{}; ? ? ?
類A是一個空類,但是它的大小并不為0,編譯期間編譯器會插入一個char在其中,這個char我們是看不到的,這樣的用處是保證生成的不同對象具有不同地址,就是要對象里有東西。 - class B:public virtual A{};
B類是對A類的虛繼承,B中一般會有指向A的實例的指針,在IA-32下為4bytes。這里不同編譯器的實現(xiàn)差別很大,有的編譯器在B的對象中也 ? ? 會保留A類的那個隱含的char,于是就有1+4=5個bytes,再考慮對齊,有些編譯器產(chǎn)生的結(jié)果為8bytes,但是在.net2003中優(yōu)化過了,不會有A中的char,也就不需要對齊,只有4bytes大 - class C:public virtual A{};//同上
- class D:public B,public C{};
? //D為8,如果編譯器不優(yōu)化A中的char就會有1(A)+8(B)+8(C)-4(B對A虛繼承)-4(C對A虛繼承)+3(對齊)=12bytes - class E{
? ? ? int i;
?};//很明顯4bytes - class F{
? ? ? double d;
};//很明顯8bytes - class G{
? ? ? double num;?
? ? ? char in;???
};//8bytes對齊,所以是8(double)+4(int)+4(對齊)=16 - class H{
? ? ? int num;?
? ? ? double in;????
};//同上 - class I{
? ? ? int num;?
? ? ? double in;????
public:
? ? ? virtual ~I(){};
};//8(double)+4(int)+4(對齊)+4(vptr)+4(對齊)=24 - class J{
? ? ? double num;?
? ? ? int in;?????
public:
? ? ? virtual ~J(){};
};//同上8(double)+4(int)+4(對齊)+4(vptr)+4(對齊)=24 - class K{
? ? ? int i;
? ? ? int k;
public:
? ? ? virtual ~K(){};
};//4(int)+4(int)+4(vptr)=12 - class L{
? ? ? int i;
? ? ? int j;
? ? ? L(){};
public:
? ? ? float ll(int i) {
? ? ? ? ? ? ?return 0.0;
} - static int hhh(int i) {
? ? ? return 0.0;
}
virtual ji(){};
};
//虛函數(shù)表的指針vptr,只有類中出現(xiàn)虛函數(shù)才會出現(xiàn),它指向虛函數(shù)表,所有虛函數(shù)的地址存放在此表中。
//4(int)+4(int)+4(vptr)=12從中看出,不管有多少虛函數(shù),大小不變,因為類中之保存虛函數(shù)表。
//不管成員函數(shù)有多少,類大小也不變,因為他們不保存在對象中,無論是否是靜態(tài)
int main(){
cout <<"A "<<sizeof(A)<<endl;
cout <<"B "<<sizeof(B)<<endl;
cout <<"C "<<sizeof(C)<<endl;
cout <<"D "<<sizeof(D)<<endl;
cout <<"E "<<sizeof(E)<<endl;
cout <<"F "<<sizeof(F)<<endl;
cout <<"G "<<sizeof(G)<<endl;
cout <<"H "<<sizeof(H)<<endl;
cout <<"I "<<sizeof(I)<<endl;
cout <<"J "<<sizeof(J)<<endl;
cout <<"K "<<sizeof(K)<<endl;
cout <<"L "<<sizeof(L)<<endl;
}
/*******************************************************************/ output .net2003
A 1
B 4
C 4
D 8
E 4
F 8
G 16
H 16
I 24
J 24
K 12
L 12
轉(zhuǎn)載于:https://www.cnblogs.com/weilf/p/4156523.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的1)C++对象大小计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下PHP多线程扩展pthr
- 下一篇: Inno_Setup使用笔记(简单完成安