7得票3回答
多重继承中虚拟方法的反汇编。vtable是如何工作的?

假设有如下的C++源代码文件: #include <stdio.h> class BaseTest { public: int a; BaseTest(): a(2){} virtual int gB() { return a; }; }; c...

11得票1回答
实现 trait 的所有类型都会生成 vtable 吗?

如果我有一个名为Foo的特质,并且一些实现者是Bar,Baz。 impl Foo for Bar { } impl Foo for Baz { } 但是假设我只使用其中一个作为特质对象, let bar = Bar {..}; let foo: &dyn Foo = &am...

7得票2回答
将EXE作为DLL加载,本地vftable

我有一个名为 test.exe 的可执行文件,通常作为独立应用程序使用。我想将这个可执行文件作为模块(dll)嵌入到另一个应用程序 app.exe 中。 test.exe 中的代码非常简单,例如: void doTest() { MyClass *inst = new MyClas...

13得票2回答
如果一个虚函数从一个虚基类继承,那么“虚thunk”是什么?

当我尝试访问从虚拟基类继承的派生类对象的内存布局时,出现了一些问题。编程环境:GNU/Linux 3.19.0-32-generic,x86_64编译器:gcc 4.8.4//virtual base class class Base { public : virtual void f...

8得票4回答
在实践中,C++ vtable 方法是如何排序的?

理论上,C ++没有二进制接口,并且vtable中方法的顺序未定义。更改类的定义中的任何内容,您需要重新编译每个依赖它的类,在每个dll等中都需要重新编译。 但我想知道的是编译器在实践中如何工作。我希望他们只是使用头文件/类中定义的方法顺序,这将使附加其他方法变得安全。但是他们也可以使用ma...

7得票2回答
编译器如何知道vtable中的哪个条目对应于虚函数?

假设在父类和派生类中有多个虚函数,那么在父类和派生类的vtable中都会创建一个与这些虚函数对应的条目。 编译器如何知道vtable中的哪个条目对应哪个虚函数呢? 例如: class Animal{ public: void fakeMethod1(){} virtual void ...

10得票1回答
为什么特质对象的虚函数表包含大小和对齐方式?

Rust的特质对象是一个包含两个常规指针的胖指针:一个指向数据,另一个指向虚函数表。虚函数表是一个结构体,其中包含析构函数指针、所有特质方法指针以及最后数据的大小和对齐方式。 大小和对齐字段的作用是什么? 我找不到太多信息: - 博客文章A:它用于释放内存,但今天没有使用,可能会被一些未...

33得票3回答
为什么虚函数不能使用返回类型推断?

n3797 文件的 § 7.1.6.4/14 节: 使用占位类型作为返回类型声明的函数不得是虚函数 (10.3)。 因此,以下程序是非法的:struct s { virtual auto foo() { } }; 关于这个原理,我所能找到的只有来自n3638...

8得票5回答
虚表和_vptr存储方案

有人能解释一下不同类的虚拟表是如何存储在内存中的吗?当我们使用指针调用函数时,它们如何使用地址位置来调用函数?我们可以使用类指针获取这些虚拟表内存分配大小吗?我想看看一个类的虚拟表使用了多少内存块。我该如何查看? class Base { public: FunctionPointe...

20得票6回答
C# 和 Java 中的虚函数是如何工作的?

C#和Java中的虚函数是如何工作的?它们是否使用与C ++类似的vtable和vpointer概念,还是完全不同的东西?