class classWithNoVirtualFunction
{
public:
int a;
void x ()
{
char c;
c = 'a';
}
};
class classWithOneVirtualFunction
{
public:
int a;
virtual void x () {}
};
class classWithTwoVirtualFunctions
{
public:
int a;
virtual void x () {}
virtual void y () {}
};
int main()
{
cout << "\nclassWithNoVirtualFunction's size: " << sizeof (classWithNoVirtualFunction);
cout << "\nclassWithOneVirtualFunction's size: " << sizeof (classWithOneVirtualFunction);
cout << "\nclassWithTwoVirtualFunctions's size: " << sizeof (classWithTwoVirtualFunctions);
cout << "\nvoid*'s size : " << sizeof (void*);
}
W.R.T 上面的代码,Thinking in C++ 说:
This example required at least one data member. If there had been no data members, the C++ compiler would have forced the objects to be a nonzero size because each object must have a distinct address. If you imagine indexing into an array of zero-sized objects, you’ll understand. A “dummy” member is inserted into objects that would otherwise be zero-sized.
我的问题:现在,如果我们有一个零成员和虚函数的类,我无法理解究竟发生了什么&&如何。请用一些编程示例进行解释。
最佳答案
只要一个类包含至少一个虚函数,编译器就需要为每个对象添加运行时类型信息。该实现通常会向每个引用结构的对象添加一个指针,该结构由编译器定义并对用户隐藏,并带有指向 type_info
对象和 vtable
的指针用于函数的动态调度。
在没有非静态数据成员和至少一个虚函数的类的情况下,每个对象的大小是每个对象的 RTTI 信息(一个指针)的大小,并且因为它是非零的,编译器不会添加额外的空间。引用的意思是 sizeof(T) != 0
对于任何和所有类型 T
,具有动态函数的类型完全符合该要求。只有对于大小为零的类型,编译器才会强制使对象变大 1 个字符。
关于c++ - 为什么只包含一个虚函数的类的大小会受到影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607254/