C++ 根据C++;标准

C++ 根据C++;标准,c++,standards,memory-layout,vptr,C++,Standards,Memory Layout,Vptr,我知道,如果一个类包含任何虚拟函数,大多数编译器(如果不是全部的话)都会添加一个指向其对象的vptr指针。有些人将其添加为第一个元素,有些人将其添加为最后一个元素。但是C++标准授权VPTR和VTABLE的使用吗?从理论上讲,任何编译器都能以其他方式实现它吗?如果是,关于多态对象的存储布局和总体大小的保证是什么(例如,是否所有显式定义的字段(+填充)都在连续内存块中) 我不知道这是否在不同的C++标准之间有所不同,这就是为什么我只添加了一般的代码> C++< /Cult>标签。 < P>没有C+

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


<>我不知道这是否在不同的C++标准之间有所不同,这就是为什么我只添加了一般的代码> C++< /Cult>标签。

< P>没有C++ C++标准中规定虚拟继承的特定实现。虚拟继承的语义是根据适当的语法和预期的结果来指定的。C++实现可以自由使用产生这些结果的任何技术实现。 例如,让我们从整个基类的虚拟继承开始:

[class.mi]

包含关键字virtual的基类说明符指定 虚拟基类。。。对于每个不同的基类 指定的虚拟、最派生的对象应包含一个基 类该类型的子对象

该标准将语法
virtual
定义为引入基类的虚拟继承,以及预期结果:最派生的对象包含虚拟继承基类的单个实例。句号。故事结束了。特定的实现是如何实现的,超出了标准的范围

类似地,对于单个虚拟函数:

[课堂.虚拟]

如果在类基类和 类派生,直接或间接派生自基。。。[一些 更多要求]。。。然后派生::vf。。。重写Base::vf


省略了一些技术要求。该标准仅规定派生类中的虚函数“重写”基类中的(相同)函数。一个特定的C++实现如何执行,在任何地方都没有被指定。

100%依赖于编译器(或者如果你喜欢,ABI依赖)正确,但是Q不是关于虚拟继承的,它的实现变化很大。虚拟功能在理论上可以以不同的方式实现,但在实践中,一般原则是一致的:虚拟功能总是通过vptr和vtables来实现。这是否意味着永远不能依赖对象(或至少是具有虚拟功能的对象)的存储布局?我的意思是,如果某个东西不在标准中,那么程序就不应该依赖它?@NPS为什么会关心确切的布局是什么?对于任何非琐碎的层次结构来说,理解vtable的内容是极其困难的;这是假设你对抛弃便携性没问题。