C++规范是否允许非虚拟类的实例包含vtable指针的内存?

Ken*_*enK 3 c++ vtable

C++规范是否允许非虚拟类的实例包含vtable指针的内存?我问这个,因为一位同事说他曾经使用过C++编译器,其中发生了以下情况:

  class MyClass
  {

     public:

     HeaderStruct header; //This had extra words
     BodyStruct     message_body;
  };
Run Code Online (Sandbox Code Playgroud)

然后他将代码更改为此,删除了额外的单词:

  struct MyClass
  {

     HeaderStruct header; //This did not have extra words
     BodyStruct     message_body;
  };
Run Code Online (Sandbox Code Playgroud)

这些类型都不是虚拟的,也不是虚拟的.所以理论上可能这个特定的编译器为类实例分配了vptr的内存,但是没有为struct实例分配内存.所以我只想确定规范是否排除了这种编译器行为.

谢谢!

Öö *_*iib 7

标准的'struct'和'class'是同义词,它们只影响类定义中对base和member的默认访问.

标准定义POD(普通旧数据).POD可能没有用户定义的构造函数,析构函数,赋值运算符,非静态引用成员和虚拟的任何东西(它的非静态成员也不应该有这样的东西).POD具有严格的内存布局规则(为了与C兼容),因此实现不能添加任何vtable或RTTI信息等.

然而,旧时代的C++编译器确实经常偏离标准而且相互之间相差很远,所以你的同事可能也是对的.