微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否改变类私人数据成员的顺序会打破ABI

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

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; ... };

编辑

types不变,只有成员的顺序。 也没有使用位标志。 该代码被用作共享库,没有静态链接到这个代码。 我在Linux上,编译器是gcc-3.4.3和gcc-4.1

Linux分发二进制兼容性

使用Visual C ++ 2005/2008/2010的便携式Windows应用程序(不是源代码

Windows上C库的二进制交叉编译器兼容性

在Windows上__cdecl或__stdcall?

ABI兼容性头/库交叉检查

_WIN32_WINNT定义在标头中更改,这是否会导致二进制不兼容?

运行/编译可执行文件Linux vs Solaris

用LSB C ++编译器构buildBoost

编写Cdynamic库(二进制兼容性+内存pipe理)

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

根据使用C ++的KDE策略/二进制兼容性问题 ,不能破坏二进制兼容性。 然而,作为他们的免责声明,他们在“你不能……”部分给出的一些建议是依赖于编译器的,所以你可能会逃避这种改变(尽管不太可能)。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐