代码之家  ›  专栏  ›  技术社区  ›  Dmitry Yudakov

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

  •  9
  • Dmitry Yudakov  · 技术社区  · 16 年前

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

    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 回复  |  直到 16 年前
        1
  •  12
  •   James McNellis    16 年前

    如果不是因为其他原因 A 可能不同,因为数据成员之间的填充字节的位置和数目不同。

        2
  •  5
  •   chalup    16 年前

    根据 KDE Policies/Binary Compatibility Issues With C++ 如果不破坏二进制兼容性,则无法执行此操作。但是,正如他们的免责声明所述,他们在“Youcannot…”部分中给出的一些建议依赖于编译器,因此您可能会忽略这些更改(尽管这不太可能)。

        3
  •  3
  •   Billy ONeal IS4    16 年前

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

        4
  •  3
  •   AshleysBrain    16 年前

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

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