10

我有一个类,其中包含许多私有数据成员(其中一些是静态的),由虚拟和非虚拟成员函数访问。没有内联函数,也没有友元类。

class A
{
    int number;
    string str;
    static const int static_const_number;
    bool b;
public:
    A();
    virtual ~A();
public:
    // got virtual and non-virtual functions, working with these memebers
    virtual void func1();
    void func2();

    // no inline functions or friends
};

在这种情况下,更改私有数据成员的顺序是否会破坏 ABI?

class A
{
    string str;
    static const int static_const_number;
    int number; // <--   integer member moved here
    bool b;
    ...
};


编辑
类型没有改变,只有成员的顺序。也没有使用位标志。该代码用作共享库,没有静态链接到该代码。我在 Linux 上,编译器是 gcc-3.4.3 和 gcc-4.1

4

4 回答 4

12

是的,如果没有其他原因,A由于数据成员之间的位置和填充字节数的不同,它的大小可能会有所不同。

于 2010-05-31T15:09:30.140 回答
5

根据KDE Policies/Binary Compatibility Issues With C++,你不能在不破坏二进制兼容性的情况下做到这一点。然而,正如他们的免责声明所述,他们在“你不能......”部分给出的一些建议取决于编译器,所以你可能会摆脱这种变化(尽管不太可能)。

于 2010-05-31T15:33:55.257 回答
3

C++ 没有定义 ABi。这里唯一正确的答案是“这取决于你的编译器”。答案可能是肯定的。

于 2010-05-31T15:11:13.610 回答
3

它可能会在您将实现编译为多个二进制文件的任何地方中断,因为您最终可能会得到两个二进制文件,其中的函数访问不同顺序的私有成员。这包括虚函数的实现,因为它们也可以将其未覆盖的实现编译到多个二进制文件中。

最好的方法是使用虚函数并将它们作为“主机”二进制文件的接口公开。然后额外的二进制文件不需要实现,因此它们总是在“主机”二进制文件中调用实现,这意味着没有不一致的空间。

于 2010-05-31T15:12:55.887 回答