我有一个私人数据成员(其中一些是静态的)数量的类,虚拟和非虚拟成员函数访问。 没有内联函数,也没有朋友类。
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。 这里唯一正确的答案是“这取决于你的编译器”。 答案可能是肯定的。
它可能会破坏你编译的实现到多个二进制文件的任何地方,因为你最终可能会得到两个函数访问不同顺序的私有成员的二进制文件。 这包括虚拟函数的实现,因为它们可以将它们未被覆盖的实现编译到多个二进制文件中。
最好的方法是使用纯虚拟函数,并将其作为“主机”二进制文件的接口公开。 然后额外的二进制文件不需要实现,所以他们总是在“主机”二进制文件中调用实现,这意味着没有不一致的空间。
总结以上是内存溢出为你收集整理的是否改变类私人数据成员的顺序会打破ABI全部内容,希望文章能够帮你解决是否改变类私人数据成员的顺序会打破ABI所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)