gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:49:52 25 4
gpt4 key购买 nike

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

  class MyClass
{

public:

HeaderStruct header; //This had extra words
BodyStruct message_body;
};

然后他将代码更改为这样,去掉了多余的单词:

  struct MyClass
{

HeaderStruct header; //This did not have extra words
BodyStruct message_body;
};

这些类型都不是虚拟的或派生自任何虚拟的。所以理论是,也许这个特定的编译器为类实例的 vptr 分配了内存,但没有为结构实例分配内存。所以我只是想确定规范是否排除了这种编译器行为。

谢谢!

最佳答案

按照标准,“struct”和“class”是同义词,仅影响对类定义中的基类和成员的默认访问。

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

然而,过去的 C++ 编译器确实经常偏离标准并且彼此之间有相当大的偏差,因此您的同事可能也是对的。

关于c++ - C++ 规范是否允许非虚拟类的实例包含用于 vtable 指针的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com