Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改类私有数据成员的顺序是否会破坏ABI_C++_Linux_Gcc_Shared Libraries_Binary Compatibility - Fatal编程技术网

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

C++ 更改类私有数据成员的顺序是否会破坏ABI,c++,linux,gcc,shared-libraries,binary-compatibility,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, workin

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

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;
    ...
};
A类
{
字符串str;
静态常量int静态常量编号;

int number;//如果由于数据成员之间的位置和填充字节数的不同,
A
的大小可能不同,那么可能是的。

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

如果将实现编译为多个二进制,则可能会中断,因为最终可能会生成两个二进制文件,其中的函数访问顺序不同的私有成员。这包括虚拟函数的实现,因为它们的未重写实现可以与也导致了多个二进制文件


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

根据您的说法,如果不破坏二进制文件的兼容性,您就无法这样做。但是,由于eir免责声明指出,他们在“Youcannot…”部分给出的一些建议依赖于编译器,因此您可能会侥幸免于更改(尽管可能性不大).

请注意,在您的情况下,您需要声明构造函数和析构函数,因为它们都是内联提供的。@Johannes是的,声明了它们,只是在描述中遗漏了它们。但是感谢您的说明,它很有用。它是一个共享库,我想它只在一个地方编译,然后在加载它的二进制文件中使用。s10倍作为提示。+1引用KDE Techbase文章。这当然是关于ABI在网络上兼容性的最好建议。@andref,怀疑这是最好的;我想是最有名的;-)