12

更改独立类中公共非虚拟非内联重载方法的顺序是否会破坏 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);
    // ...
};

谢谢!

4

2 回答 2

11

这些函数是通过它们的名称和签名链接的,而不是它们在类中的位置。所以不,你没有破坏 ABI。

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

于 2012-05-10T15:09:14.177 回答
1

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

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

正如 Russel Greene 所指出的(见评论),变量成员的顺序也会导致对齐差异,这足以改变分配对象的大小。这也会破坏您的分配(假设客户的代码使用new

并且添加/删除成员可能不会破坏 ABI(您仍然可以在此处分配一个字节或在那里分配一个字......)但这通常是一个交易破坏者。

于 2012-05-10T15:53:10.210 回答