gpt4 book ai didi

c++ - 根据 C++ 标准的多态对象的存储布局

转载 作者:行者123 更新时间:2023-12-01 14:48:30 25 4
gpt4 key购买 nike

我知道,如果一个类包含任何虚函数,大多数编译器(如果不是全部)都会为其对象添加一个 vptr 指针。有的将其添加为第一个元素,有的将其添加为最后一个元素。但是 C++ 标准是否要求使用 vptr 和 vtable?理论上,任何编译器都可以以其他方式实现它吗?如果是这样,关于多态对象的存储布局和整体大小的保证是什么(例如,是否所有明确定义的字段(+填充)都在一个连续的内存块中)?

我不知道这是否在各种 C++ 标准之间有所不同,这就是为什么我只添加了通用 C++标签。

最佳答案

C++ 标准中没有规定虚拟继承的特定实现。虚拟继承的语义是根据适当的语法指定的,预期的 结果 . C++ 实现可以自由使用产生这些结果的任何技术实现。

例如,让我们从整个基类的虚拟继承开始:

[class.mi]

A base class specifier that contains the keyword virtual specifies a virtual base class. ... For each distinct base class that is specified virtual, the most derived object shall contain a single base class subobject of that type.



该标准定义了语法 virtual正如引入基类的虚拟继承一样,预期的结果是:最派生的对象包含虚拟继承的基类的单个实例。句号。故事结局。特定实现如何做到这一点超出了标准的范围。

同样,对于单个虚函数:

[class.virtual]

If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base ... [ a few more requirements ] ... then Derived::vf ... overrides Base::vf.



省略了一些技术要求。该标准仅指定派生类中的虚函数“覆盖”基类中的(相同)函数。没有在任何地方指定特定的 C++ 实现是如何进行的。

关于c++ - 根据 C++ 标准的多态对象的存储布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60715086/

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