c++ - 为什么只包含一个虚函数的类的大小会受到影响?

标签 c++ function virtual

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/

相关文章:

Python函数替换输入变量

function - 如何在Powershell中返回202 Accepted然后继续处理请求

c++ - 抽象类中的虚拟类

c++ - 计数排序 我的输入是1,4,3,1 但输出是垃圾值,1,1,3 输入不正确

c++ - Qt 中的多色工具提示

c++ - OpenCV拼接

php - 如何构建自定义 PHP Mysql 或 PDO 函数

c++ - 是否有可能确定/断言,如果一个虚函数被覆盖,另一个虚函数也被覆盖?

c++ - 从析构函数调用虚函数

c++ - 一些boost线程问题C++