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,怀疑这是最好的;我想是最有名的;-)