use*_*288 16 c++ virtual class object sizeof
这是一个在线C++测试问题,已经完成.
#include<iostream>
using namespace std; 
class A
{
};
class B
{
int i; 
}; 
class C
{
void foo();
};
class D
{
virtual void foo();
};
class E
{
int i ; 
    virtual void foo();
};
class F
{
int i; 
    void foo();
};
class G
{
    void foo();
    int i;
    void foo1();
};
class H
{
    int i ;
    virtual void foo();
    virtual void foo1();
};
int main()
{
cout <<"sizeof(class A) : " << sizeof(A) << endl ;
cout <<"sizeof(class B) adding the member int i : " << sizeof(B) << endl ;
cout <<"sizeof(class C) adding the member void foo() : " << sizeof(C) << endl ;
cout <<"sizeof(class D) after making foo virtual : " << sizeof(D) << endl ;
cout <<"sizeof(class E) after adding foo virtual , int : " << sizeof(E) << endl ;
cout <<"sizeof(class F) after adding foo  , int : " << sizeof(F) << endl ;
cout <<"sizeof(class G) after adding foo  , int : " << sizeof(G) << endl ;
G g;
cout <<"sizeof(class G) after adding foo  , int : " << sizeof(g) << endl ;
cout <<"sizeof(class H) after adding int 2 virtual " << sizeof(H) << endl ;
return 0; 
}
输出:
sizeof(class A) : 1
sizeof(class B) adding the member int i : 4
sizeof(class C) adding the member void foo() : 1
sizeof(class D) after making foo virtual : 8
sizeof(class E) after adding foo virtual , int : 16
sizeof(class F) after adding foo  , int : 4
sizeof(class G) after adding foo   , unsigned int : 4
sizeof(class g) after adding foo  , unsigned int : 4
sizeof(class H) after adding int 2 virtual 16
我的问题:
为什么siszeof(A)1和sizeof(C)1也是1?
为什么siszeof(H)是16但是sizeof(G)4?
为什么siszeof(E)是16但是sizeof(F)4?
为什么siszeof(D)是8但是sizeof(E)16?  
我猜:
虚函数是一个8字节的指针.但是,我不知道为什么E尺寸是16?向空类添加函数不会改变其大小?
任何帮助表示赞赏.
谢谢
Luc*_*ore 38
首先,虚函数不是8字节的指针.在C++中,只sizeof(char)保证任意数量的字节.
其次,只有类中的第一个虚函数增加了它的大小(依赖于编译器,但在大多数情况下 - 如果不是全部的话 - 就像这样).所有后续方法都没有.非虚函数不会影响类的大小.
发生这种情况是因为类实例不保存指向方法本身的指针,而是指向虚拟函数表(每个类一个).
所以如果你有:
class A
{
   virtual void foo();
}
和
class B
{
   virtual void goo();
   virtual void test();
   static void m();
   void x();
}
你会的sizeof(A) == sizeof(B).
现在:
为什么siszeof(A)是1而sizeof(C)也是1?
A并且C大小为1只是因为它不允许类的大小为0.这些函数与它无关.它只是一个虚拟字节.
为什么siszeof(H)是16但sizeof(G)是4?
G只有一个成员占记忆 - 的int.在你的平台上,sizeof(int) == 4.H除此之外int,还有一个指向vftable(虚函数表,见上文)的指针.其大小,int和allignment的大小是特定于编译器的.
为什么siszeof(E)是16但sizeof(F)是4?
上面解释 - 非虚方法不占用类中的内存.
为什么siszeof(D)是8但sizeof(E)是16?
D只包含vftable您平台上显然为8个字节的指针.E也有一个int,并且vftable对齐到8个字节.所以它是这样的:
class E
4 bytes for int |  4 padding bytes  |  8 bytes for vftable pointer  | 
| x | x | x | x |    |    |    |    | v | v | v | v | v | v | v | v |