问题标签 [vptr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2469 浏览

c++ - 为什么派生类不覆盖虚函数时需要 vptr?

这里类中定义的函数 fn 的签名与类中定义base的函数的签名不同,尽管函数名称相同。因此,类中定义的函数隐藏了类函数。所以类 版本的 fn 不能被调用;没事。fn()derderbasefn()derp->fn(i)

我的观点是为什么要sizeof上课base,或者der如果4没有使用VTABLE 指针这里对VTABLE 指针有什么要求?

0 投票
4 回答
883 浏览

c++ - 实现 vptr 的替代方案?

这个问题不是关于 C++ 语言本身(即不是关于标准),而是关于如何调用编译器来实现虚函数的替代方案。

实现虚函数的一般方案是使用指向指针表的指针。

相当于说 C 会是这样的

第一个成员通常是指向虚函数列表等的指针(应用程序无法控制的内存中的一块区域)。在大多数情况下,在考虑成员等之前,这恰好花费了指针的大小。因此,在 32 位寻址方案中,大约 4 个字节等。如果您在应用程序中创建了 40k 多态对象的列表,则大约为 40k x在任何成员变量等之前 4 字节 = 160k 字节。我也知道这恰好是 C++ 编译中最快和最常见的实现。

我知道这因多重继承而变得复杂(尤其是其中的虚拟类,即菱形结构等)。

另一种方法是将第一个变量作为 vptrs 表的索引 id(在 C 中等效,如下所示)

如果应用程序中的类总数少于 255(包括所有可能的模板实例化等),则 char 足以容纳索引,从而减少应用程序中所有多态类的大小(我不包括对齐问题, ETC)。

我的问题是,GNU C++、LLVM 或任何其他编译器中是否有任何开关可以做到这一点?或减小多态对象的大小?

编辑:我了解指出的对齐问题。还有一点,如果这是在 64 位系统上(假设是 64 位 vptr),每个多态对象成员的成本约为 8 个字节,那么 vptr 的成本是内存的 50%。这主要与大量创建的小型多态有关,所以我想知道如果不是整个应用程序,这种方案是否至少适用于特定的虚拟对象。

0 投票
1 回答
621 浏览

c++ - C++/编译:是否可以设置 vptr 的大小(全局 vtable + 2 字节索引)

我最近发布了一个关于 C++ 中的虚拟性导致的内存开销的问题。答案让我了解 vtable 和 vptr 是如何工作的。我的问题如下:我在超级计算机上工作,我有数十亿个对象,因此我必须关心由于虚拟性导致的内存开销。经过一些措施,当我使用具有虚函数的类时,每个派生对象都有其 8 字节的 vptr。这一点也不容忽视。

我想知道英特尔 icpc 或 g++ 是否有一些配置/选项/参数,以使用具有可调节精度的“全局”vtables 和索引而不是 vptr。因为这样的事情将允许我对数十亿个对象使用 2 字节索引(无符号短整数)而不是 8 字节 vptr(并且很好地减少了内存开销)。有没有办法通过编译选项来做到这一点(或类似的事情)?

非常感谢。

0 投票
3 回答
553 浏览

c++ - C++:虚拟指针的原型

我不确定这是否记录在任何地方。我们都知道在虚函数的情况下,每个类都有一个 vptr,它指向一个称为虚表的函数指针数组。我想知道vptr的原型是什么。例如,如果一个类声明如下,

现在我们在 A 类的 vtable 中有两个函数指针。单个 vptr 如何能够定义不同原型的两个定义?

如果我的理解有误,请告诉我。

谢谢!拉胡尔。

0 投票
2 回答
725 浏览

c++ - 子对象中存在 VPTR

我有一个带有虚拟析构函数的类“基础”,因此有一个 VTable 和相应的 VTPR,以及一个从它派生的类:

现在,由于派生类也是虚拟的,它会有自己的 VPTR,但由于它还有一个基类的子对象,其中有一个 VPTR,所以“der”类的大小不应该是 8 个字节,即'der' 类的 VPTR 的大小 + 'base' 类的子对象的 VPTR 的大小?(当 sizeof(void*) = 4 bytes 时)。

所以基本上我的问题是:当类 'base' 的子对象是在 'der' 中制作时,它有一个单独的新 VPTR 吗?如果是这样,那么为什么在计算“der”的大小时没有添加它的大小?

有人可以澄清一下吗。

0 投票
2 回答
3522 浏览

c++ - 虚函数表指针在对象中的位置

据我了解,virtual对象中函数指针表的位置取决于编译器。
将此指针放在对象的开头与结尾是否有任何优点/缺点,反之亦然?

0 投票
7 回答
6032 浏览

java - 在构造函数中调用虚方法:Java 和 C++ 的区别

在 Java 中:

这将输出

但是,在 C++ 中,结果是不同的:

(有关C++ 代码,请参阅http://www.parashift.com/c++-faq-lite/calling-virtuals-from-ctors.html )

是什么导致了 Java 和 C++ 之间的这种差异?是初始化vtable的时间吗?

编辑:我确实了解 Java 和 C++ 机制。我想知道的是这个设计决策背后的见解。

0 投票
2 回答
1529 浏览

c++ - vptr(虚拟指针)在只有参数化构造函数的类中初始化在哪里?

假设我有这样的课

VPTR 在构造函数的开头被初始化。但在这种情况下,没有默认构造函数,只有 2 个参数化构造函数。VPTR 将在哪里初始化?

0 投票
7 回答
3420 浏览

c++ - 为什么 vptr 不是静态的?

每个包含一个或多个虚函数的类都有一个与之关联的 Vtable。一个名为 vptr 的 void 指针指向该 vtable。该类的每个对象都包含指向同一个 Vtable 的 vptr。那为什么不是 vptr static ?与其将 vptr 与对象相关联,不如将其与类相关联?

在此处输入图像描述

0 投票
2 回答
2564 浏览

c++ - 键入特征以识别主要基类

如果我有一个类 Base,至少有一个虚函数,以及一个从该类单独继承的 Derived 类,那么(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)即使 Derived 不是标准布局,也可以保证(由 Itanium ABI)为零。然而,在一般情况下,这不一定是真的(例如多重继承)。

是否可以编写一个特征来检测一个类是否是另一个类的主要基类?

Itanium ABI 中的有用部分:

http://refspecs.linux-foundation.org/cxxabi-1.83.html

主要基类

对于动态类,唯一的基类(如果有),它在偏移量 0 处共享虚拟指针。它是第一个(按直接基类顺序)非虚拟动态基类(如果存在)。

动态类

需要虚拟表指针的类(因为它或其基类具有一个或多个虚拟成员函数或虚拟基类)。