我有一个类,其中包含许多私有数据成员(其中一些是静态的),由虚拟和非虚拟成员函数访问。没有内联函数,也没有友元类。
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
可能是的,如果没有其他原因,由于数据成员之间的位置和填充字节数的差异,
A
的大小可能会有所不同。
根据KDE 策略/C++ 的二进制兼容性问题,您无法在不破坏二进制兼容性的情况下做到这一点。然而,正如他们的免责声明所述,他们在“你不能......”部分给出的一些建议是依赖于编译器的,所以你可能会逃脱这种改变(尽管可能性不大)。
C++ 没有定义 ABi。这里唯一正确的答案是“这取决于你的编译器”。答案可能是肯定的。
它可能会在将实现编译为多个二进制文件的任何地方中断,因为最终可能会得到两个二进制文件,其中的函数访问不同顺序的私有成员。 这包括虚拟函数的实现,因为它们也可以将其未重写的实现编译到多个二进制文件中。
最好的方法是使用pure虚拟函数并将它们公开为来自“主机”二进制文件的接口。 然后其他二进制文件不需要实现,因此它们总是调用“主机”二进制文件中的实现,这意味着没有不一致的空间。