vptr相关内容
这个问题专门针对不可移植的 MSVC ABI 内容. 我正在尝试用明显不可移植但不神奇的 C++ 编写 C++ 的 typeid 等价物.对于 Itanium ABI(在 Linux/Mac 上使用),这非常简单: const std::type_info&dynamicast_typeid(void *mdo){std::type_info **vptr = *reinterpret_c
..
我读了这篇文章:https://shaharmike.com/cpp/vtable-part2/ 我不明白为什么在 vtable 中(在文章末尾)我们有这个指针: 0x400918 0x400820 非虚拟 thunk 到 Child::FatherFoo() 但不是直接指向方法 Child::FatherFoo() 的指针? 我假设孩子的 vtable 与父亲的 vtab
..
C ++支持通过虚拟机制进行动态绑定.但是据我了解,虚拟机制是编译器的实现细节,而该标准仅指定了在特定情况下应发生的行为.大多数编译器通过虚拟表和虚拟指针来实现虚拟机制.这与虚拟指针和表的实现细节无关.我的问题是: 除了虚拟指针和虚拟表机制之外,是否有任何编译器以其他方式实现虚拟函数的动态分配?据我所知(通过阅读G ++,Microsoft Visual Studio),大多数人都是通过虚拟
..
在此代码中,ob1的大小为16,这很好(由于虚拟指针),但我不明白为什么ob2的大小为24. #include using namespace std; class A { int x; }; class B { int y, z; }; class C : virtual public A { int a; }; class D : virtu
..
我阅读了以下问题: C ++虚拟类继承对象大小问题,并且想知道为什么虚拟继承会在类中导致附加的vtable指针. 我在这里找到了一篇文章: https://en.wikipedia.org/wiki/Virtual_inheritance 告诉我们: 但是,通常只能在运行时知道此偏移量,... 我在这里不了解与运行时相关的内容.完整的类继承层次结构在编译时就已为人所知.我了
..
对于某些编译器,如果类具有虚函数,则可以使用其对象的第一个字节的地址访问其vptr.例如, class Base{ public: virtual void f(){cout
..
有此代码: #include class Base { int x; }; class Derived : virtual public Base { int y; }; int main() { std::cout
..
如果我有一个至少具有一个虚函数的Base类,以及一个单独继承自此的Derived类,则即使It Derived不是标准布局,也可以通过Itanium ABI确保(uintptr_t)derived - (uintptr_t)static_cast(derived)为零.但是,在一般情况下,这不一定是正确的(例如,多重继承). 是否可以编写一个可用于检测一个类是否是另一个类的主要
..
据我了解,virtual函数指针表在对象中的位置取决于编译器. 将指针放在对象的开头还是结尾是否有任何利弊?反之亦然? 解决方案 虚拟函数表的存在仅依赖于编译器(但是所有编译器都依赖),并且也不要求位置...在所有编译器中我知道细节,vptr存储在对象的开头.原因是它提供了统一的位置.考虑一个类层次结构: struct base { T data; virtual vo
..
在调试程序的核心转储之一时,我遇到了一个场景,即它包含的多态对象丢失了VPTr,并且可以看到它指向NULL. 当对象丢失其VPTr时会发生什么情况. 预先感谢, Brijesh 解决方案 内存已被清除,即某些东西覆盖了内存. 您通过调用delete或直接调用析构函数销毁了它.通常,这不会使vptr变为NULL,最终只会使其指向基类的vtable,但这取决于您的实现.
..
有一个通用的方法(不依赖于平台)在编译时获取内存中类对象的大小,而不计数vtable指针? 解决方案 正在请求一个可移植的方式: class MyClass { private: struct S { DataMemberType1 dataMember1; ... DataMemberTypeN dataMemberN; } m; public:
..
这个问题不是关于C ++语言本身(即不是关于标准),而是关于如何调用编译器来实现虚拟函数的替代方案。 用于实现虚拟函数的一般方案是使用指向指针表的指针。 class Base { private: int m; public: virtual metha(); }; 等效地说,C将是 struct Base { void(** vtable)
..
这不是关于“当VTABLE创建时?”。相反,当VPTR应该被初始化?是在构造函数的开始/结束还是在构造函数之前/之后? A :: A():i 0),j(0)→>这里 ? { - >>这里 ? // ... - >>这里 ? } 解决方案 虚拟通话通常是v表,但不需要)在构建基本子对象之前和构建成员之前在 ctor-initializer 期间设置。 [
..
对于clas(child)具有单继承的对象通常需要多少个vptr,其中多个继承base1和base2的基类。什么是确定一个对象有多少vptr提供它有几个单继承和多重继承的策略。虽然标准没有指定关于vptrs,但我只是想知道一个实现如何实现虚函数。 解决方案 您为什么关心?简单的答案是够,但我想你想要更完整的东西。 这不是标准的一部分,所以任何实现是免费的但是一般的经验法则是,在使用虚
..
我对于vptr和内存中对象的表示感到困惑,希望你能帮助我更好地理解这件事。 考虑 B 继承 A ,并定义虚函数 f code>。从我学到的内存中类B的对象的表示形式如下: [vptr | A | B] 和 vtbl 表示 vptr $ c> B :: f()。我还理解,将对象从 B 转换为 A 除了忽略 / code>部分在对象的结尾。是真的吗?这种行为不是错误吗?我们希望类型 A 的对象
..
我试图理解书中有效的c ++中的语句。以下是多重继承的继承图。 / p> 现在这本书说vptr需要每个类中有独立的内存。它也使下面的语句 上图中的奇怪是,只有三个vptr,即使涉及四个类。实现可以自由地生成四个vptr,如果他们喜欢,但三个足够(原来是B和D可以共享一个vptr),大多数实现利用这个机会减少编译器生成的开销。 p> 我看不到任何理由为什么在vptr的每个类中
..
假设我们有以下程序: class A {public: virtual fun ){}; }; class B:public A {public: virtual fun(){}; }; int main() { A a1; B b1; } 我的问题是多少 vtables 解决方案 div> 它严重依赖于实现,但通常你会得到
..
每个包含一个或多个虚函数的类都有一个与它相关的V表。一个名为vptr的void指针指向该vtable。该类的每个对象都包含指向同一个Vtable的vptr。那么为什么vptr不是静态的呢?而不是将vptr与对象关联,为什么不将它与类关联? 解决方案 对象的运行时类是对象本身的属性。实际上, vptr 表示运行时类,因此不能是 static 。但是,它指向的是同一个运行时类的所有实例可以共享
..
在Java中: class Base { public Base(){System.out.println ::基础()”); virt(); } void virt(){System.out.println(“Base :: virt()”); } } 类Derived extends Base { public Derived(){System.out.println(
..
首先,我想澄清一下,我明白在C ++标准中没有vtables和vptrs的概念。 然而,我认为几乎所有的实现实现虚拟调度机制以几乎相同的方式(纠正我,如果我错了,但这不是主要的问题)。此外,我相信我知道虚拟函数如何工作,也就是说,我总是可以告诉调用哪个函数,我只需要实现细节。 假设有人问我以下内容: “您的基类B具有虚函数v1,v2,v3和派生类D:B,它覆盖函数v1和v3并添加虚函数
..