更改类私有数据成员的顺序是否会破坏ABI

时间:2010-05-31 15:00:22

标签: c++ linux gcc shared-libraries binary-compatibility

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

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 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

根据KDE Policies/Binary Compatibility Issues With C++,如果不打破二进制兼容性,就无法做到这一点。但是,正如他们的免责声明所述,他们在“你不能......”部分提供的一些建议依赖于编译器,所以你可能会摒弃这种变化(虽然不太可能)。

答案 2 :(得分:3)

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

答案 3 :(得分:3)

它可能会破坏你将实现编译成多个二进制文件的任何地方,因为你最终可能会得到两个二进制文件,其中的函数可以访问不同排序的私有成员。这包括虚函数的实现,因为它们可以将其非重写实现编译到多个二进制文件中。

最好的方法是使用 pure 虚拟函数,并将这些函数作为“host”二进制文件的接口公开。然后其他二进制文件不需要实现,所以它们总是在'host'二进制文件中调用实现,这意味着没有不一致的余地。