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上面的代码,《 C ++中的思考》说:


  此示例至少需要一个数据成员。如果没有
  数据成员,则C ++编译器会强制将对象变为
  非零大小,因为每个对象必须具有不同的地址。如果你
  想象一下索引到大小为零的对象的数组中,您将
  了解。将“虚拟”成员插入将
  否则为零。


我的问题:现在,如果我们有一个具有零成员和一个虚函数的类,我将无法理解&&会如何发生。请通过一些编程示例进行解释。

最佳答案

只要一类包含至少一个虚函数,编译器就需要向每个对象添加运行时类型信息。该实现通常会向指向由编译器定义并向用户隐藏的结构的每个对象添加单个指针,并带有指向type_info对象和用于动态分配功能的vtable的指针。

对于没有静态数据成员和至少一个虚函数的类,每个对象的大小是每个对象RTTI信息的大小(一个指针),并且由于该值非零,因此编译器不会增加额外的空间。引用的意思是,对于所有类型sizeof(T) != 0T,具有动态功能的类型都可以轻松满足该要求。仅对于大小为零的类型,编译器被迫将对象1个字符设为大。

关于c++ - 为什么仅包含虚函数的类的大小会受到影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7607254/

10-11 22:15
查看更多