草庐IT

windows - 未修饰的 Microsoft 符号 : SomeClass: :`vftable' {for `Foo::Bar' }

我正在使用dbghelp中的UnDecorateSymbolNameW来取消修饰Microsoft符号名称。当使用UNDNAME_COMPLETE取消修饰时,符号名称有时会包含某些编译器附加的信息,据我所知。例如,一个vftable符号有时可以有一个大括号block,其中包含一个for关键字,后跟一个类/接口(interface)名称,例如SomeClass::'vftable'{for'Foo::Bar'}谁能告诉我名称的"{for'Foo::Bar'}"部分是什么意思?此外,是否有人知道有关此的一些文档,所以我可以阅读,因为我找不到任何内容。非常感谢!

c++ - vfptr/vftable 在类析构函数调用父析构函数时更改基类型

我使用的是visualstudio2008、c++、win32,没有点网。我遇到了在父级的析构函数中调用的虚函数的问题。例如,以类a和b为例。a类有一个虚函数叫Hello();调用时,它会打印hello。b类继承自a类,同样实现了函数Hello。调用时,它会打印world。在类a的析构函数中,函数Hello被调用。删除类b时,先调用b的析构函数,再调用a的析构函数。在a的析构函数中调用了Hello函数,除了它是与类a而不是类b相关联的实现。此行下方的示例代码。classa{public:virtualvoidHello();a();~a();};a::a(){};a::~a(){Hel

c++ - vftable[0] 存储的是第一个虚函数还是 RTTI Complete Object Locator?

我们都知道C++使用vftable来动态决定应该调用哪个虚函数。而我想弄清楚我们调用虚函数时背后的机制。我已将以下代码编译为程序集。usingnamespacestd;classAnimal{intage;public:virtualvoidspeak(){}virtualvoidwash(){}};classCat:publicAnimal{public:virtualvoidspeak(){}virtualvoidwash(){}};voidmain(){Animal*animal=newCat;animal->speak();animal->wash();}汇编代码非常庞大。我不

c++ - 将 EXE 作为 DLL 加载,本地 vftable

我有一个名为test.exe的exe,通常用作独立应用程序。我想在另一个应用程序app.exe中将此exe作为模块(dll)使用。test.exe中的代码做了一些非常简单的事情,比如:voiddoTest(){MyClass*inst=newMyClass();inst->someMethod();}其中someMethod()是虚拟的,而MyClass有一个虚拟的驱动程序。doTest()从test.exe导出,因此创建了一个名为test.lib的库app.exe与此库链接以在启动时静态加载test.exe。当我单独运行test.exe时,它​​运行得很好,但是当我运行它时,它从ap

c++ - vftable 性能损失与 switch 语句

C++问题在这里。我有一个系统,其中我将拥有给定父类(superclass)的数百个迷你子类。他们都有一个做某事的“foo”方法。或者...我将拥有一个名为“type”的整数类,并使用一个巨大的switch语句来决定当我foo时要做什么。性能在这里是一个重要的考虑因素。非常重要。问题是,使用switch语句与让C++通过vftable来实现性能优势/劣势是什么?如果我把它作为一个switch语句,我可以把经常出现的foo放在switch语句的顶部,把不太常见的放在底部,希望能简化比较。尝试使用vftable获得这样的效果必然取决于编译器,即使我能弄清楚如何做到这一点......另一方面