代码之家  ›  专栏  ›  技术社区  ›  Tobias Langner

vtable中重载方法的顺序(在win32上)

  •  2
  • Tobias Langner  · 技术社区  · 16 年前

    vtable中重载方法的顺序在win32编译器中是否始终相同?

    问题: 我有“接口”(没有数据成员的纯虚拟类)。它们可以通过来自不同编译器的指针来使用(客户端通过调用标准的C dll工厂方法来获取指针)。这在不同的编译器(例如用Borland编写的客户端,用Visual C++编写的接口DLL)中很好,除了一种方法。 此方法重载了相同的返回值,但参数不同。此方法有4个版本。对该方法的相同调用根据编译客户端的编译器返回不同的结果。快速查看汇编程序代码,我发现vtable中似乎有不同的偏移量(我不太擅长阅读汇编程序)。

    现在我不知道-我找到原因了吗,或者Borland只是在处理与Visual Studio不同的vtable,一切都是正确的,我必须在其他地方搜索。

    致以最诚挚的问候,感谢您的回答。

    托拜厄斯

    4 回复  |  直到 15 年前
        1
  •  1
  •   Anthony Williams    16 年前

    有两个可能的原因:要么客户机编译器选择的重载与预期的不同,要么不同的编译器将重载放入不同的vtable条目中。

    您传递/期望什么参数?过载解决可能是问题吗?

    如果是vtable条目,那么可以尝试重命名重载。

    在声明接口时,您是否尝试使用目标编译器上可用的任何COM机制——例如,使用 interface 关键字,并为接口类提供一个guid。COM接口应该按照声明的顺序在vtable中具有函数,因此,如果编译器共享相同的头,则它们之间是通用的。

        2
  •  1
  •   R Samuel Klatchko    16 年前

    vtable中的功能顺序是 ABI . 不幸的是,ABI不是C++标准的一部分,所以不同编译器使用不同的ABIs是很常见的。

        3
  •  1
  •   mr.marmot    15 年前

    几年前我们遇到了这个问题。我现在找不到太多支持它的文档,但据我所知,Visual Studio组会重载vtable中的函数,即使它们是单独声明的。这导致我们的构建在gcc中工作正常,但在Visual Studio中崩溃。我相信我们最终只是移除了重载函数,因为我们没有找到解决方法。

        4
  •  0
  •   dascandy    16 年前

    它不必是错误的索引——它们的vtable中可以有完全不同大小的条目。除非他们的ABI匹配,否则无法保证任何事情都是一样的。当他们的ABI匹配时,这是有保证的。

    可能的ABI是由GCC和英特尔的C++编译器使用的IA64 ABI,或者是微软引入的COM互操作。