是vtable中重载方法的顺序在win32编译器中始终是相同的吗?
问题: 我有“接口”(没有数据成员的纯虚拟类)。它们可以通过来自不同编译器的指针使用(客户端通过调用标准的c dll工厂方法获取指针)。这适用于不同的编译器(例如用borland编写的客户端,用Visual C ++编写的接口dll),除了一种方法。 此方法使用相同的返回值但不同的参数重载。这种方法有4个版本。对此方法的相同调用将返回不同的结果,具体取决于编译客户端的编译器。快速查看汇编程序代码向我显示vtable中似乎有不同的偏移量(我不太擅长阅读汇编程序)。
现在我不知道 - 我找到了原因,或者是borland只是处理与视觉工作室不同的vtable,一切都是正确的,我必须在别处搜索。
最好的问候,谢谢你的答案
托拜厄斯
答案 0 :(得分:1)
vtable中的函数顺序是ABI所涵盖的内容之一。不幸的是,ABI不是C ++标准的一部分,因此不同的编译器使用不同的ABI是很常见的。
答案 1 :(得分:1)
有两种可能的原因:客户端编译器选择的输入超出了您的预期,或者不同的编译器将重载放在不同的vtable条目中。
您传递/期待的参数是什么?重载决议可能是问题吗?
如果是vtable条目,那么您可以尝试重命名重载。
在声明界面时,您是否尝试使用目标编译器上可用的任何COM机制---例如在MSVC中使用interface
关键字,并为您的接口类提供GUID。 COM接口应该按照声明的顺序在vtable中具有函数,因此如果它们共享相同的头,则在编译器之间是常见的。
答案 2 :(得分:1)
几年前我们遇到了这个问题。我现在找不到很多支持文档,但我的理解是,即使它们被单独声明,visual studio也会在vtable中重载函数。这导致我们的构建在gcc中正常工作,但在visual studio中崩溃。我相信我们最终只是删除了重载函数,因为我们没有找到解决方法。
答案 3 :(得分:0)
它不一定是错误的索引 - 它们的vtable中可以有完全不同的大小条目。除非他们的ABI匹配,否则不能保证任何相同的东西。当他们的ABI匹配时,它是有保证的。
可能的ABI是由GCC和英特尔的C ++编译器使用的IA64 abi,或微软推出的COM互操作。