在独立类中重新排序公共非虚拟方法会破坏ABI吗?

时间:2012-05-10 15:05:27

标签: c++ backwards-compatibility abi

在独立类中更改公共非虚拟非内联重载方法的顺序是否会破坏ABI?

在:

class MyFinalClass
{
public:
    // ...
    void doSomething(char c, int i, int n);
    void doSomething(char c, int i);
    // ...
};

后:

class MyFinalClass
{
public:
    // ...
    void doSomething(char c, int i);
    void doSomething(char c, int i, int n);
    // ...
};

谢谢!

2 个答案:

答案 0 :(得分:9)

这些功能是通过名称和签名来链接的,而不是它们在班级中的位置。所以不,你没有打破ABI。

虚拟函数是另一回事,因为它们是通过它们在vtable(通常)中的位置链接的。如果您始终重新编译依赖于定义顺序的标头的每个文件,这将不会成为问题,但如果该类存在于库中,则可能是一个问题。

答案 1 :(得分:1)

更新课程时,有两件事会破坏ABI。 Mark指出的虚函数(记住它并不是因为你没有将函数标记为虚函数而不是它。)

另一个是内联函数,因为它们使用了你的变量成员。如果变量成员的顺序发生变化,那么在其他软件中编译的内联也会中断。