gpt4 book ai didi

c++ - 更改接口(interface)类中私有(private)成员变量的指针类型二进制兼容吗?

转载 作者:行者123 更新时间:2023-12-01 23:50:07 25 4
gpt4 key购买 nike

class Type1;
class Type2;
class __declspec(dllexport) Foo
{
public:
Foo();

private:
Type1 * m_p1;
Type2 * m_p2;
};

我可以在不破坏二进制兼容性的情况下用 Type3 替换 Type1 吗?

背景:不幸的是,这个类不使用 pimpl 习惯用法。为了解决这个问题,我想用 pimpl 指针替换指针 m_p1

使用 Visual Studio 2010、Windows 7 和 10。

最佳答案

无法从提供的代码示例中在调用方访问 m_p2

即便如此,从技术角度来说,这还是非常破坏 ABI 的。

但是,如果假设成立(100% 确定 m_p2 不会以某种方式暴露),那么只有在更改指向的类型可能会更改类的布局时,ABI 才会中断。

但这似乎有点奇怪 - 即使不可能在 C++ 语言级别提供保证。

因此,需要检查特定设置的两个版本之间的布局是否发生变化。可以通过以下方式进行检查:

Foo* p = 0;
&p.m_p1;//offset to m_p1 (make a static member function for the check itself)

由于 Foo 上没有虚函数,所以幸运的是,我们不需要担心这个类 - 否则也应该进行测试以确保绝对确定。

唯一剩下的就是可以留下的任何可能的名称 - 当然仍然不可能更改 - 但其本身不应该破坏 ABI。

关于c++ - 更改接口(interface)类中私有(private)成员变量的指针类型二进制兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58265503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com