理论上,C ++没有二进制接口,并且vtable中方法的顺序未定义。更改类的定义中的任何内容,您需要重新编译每个依赖它的类,在每个dll等中都需要重新编译。
但我想知道的是编译器在实践中如何工作。我希望他们只是使用头文件/类中定义的方法顺序,这将使附加其他方法变得安全。但是他们也可以使用mangled名称的哈希来使它们独立于顺序,但也完全无法升级。
如果人们对特定版本的特定编译器在不同操作系统中的工作方式有具体的了解,那将非常有帮助。
补充:理想情况下,链接器符号将为虚拟方法偏移量创建,以便偏移量永远不会被硬编码到调用函数中。但我的理解是从来没有这样做。正确吗?
但我想知道的是编译器在实践中如何工作。我希望他们只是使用头文件/类中定义的方法顺序,这将使附加其他方法变得安全。但是他们也可以使用mangled名称的哈希来使它们独立于顺序,但也完全无法升级。
如果人们对特定版本的特定编译器在不同操作系统中的工作方式有具体的了解,那将非常有帮助。
补充:理想情况下,链接器符号将为虚拟方法偏移量创建,以便偏移量永远不会被硬编码到调用函数中。但我的理解是从来没有这样做。正确吗?