【问题标题】:Does adding a new member variable to a class affects the binary compatibility? [duplicate]向类添加新成员变量会影响二进制兼容性吗? [复制]
【发布时间】:2017-12-06 12:13:27
【问题描述】:

我在共享库中有一个名为 AMFactory 的类。这个共享库被许多用户应用程序使用。现在我想在我的类中添加一个新的私有成员变量。这会破坏二进制兼容性吗?如果它坏了,那么是否有破解之法。就我而言,我不希望重新编译用户应用程序。下面是我的类 [AMFactory] ​​及其基类 [Factory] ​​的片段。

namespace CF {
class CF_EXPORT Factory {
 public:
 virtual ~Factory();

 virtual bool registerManager(const std::string &_interface,
                      const Id_t &_id) = 0;
 virtual bool unregisterManager(const std::string &_interface,
                      const Id_t &_id) = 0;
};
}
namespace CF {
namespace AM {
class AMFactory : public CF::Factory {
public:
CF_EXPORT static std::shared_ptr<AMFactory> get();

CF_EXPORT AMFactory();
CF_EXPORT virtual ~AMFactory();

CF_EXPORT bool registerManager(const std::string &_interface,
                      const Id_t &_id);
CF_EXPORT bool unregisterManager(const std::string &_interface,
                      const Id_t &_id);

private:
CF_EXPORT bool registerManager(std::shared_ptr<AMManager>);
CF_EXPORT bool unregisterManager(std::shared_ptr<AMManager>);

static std::shared_ptr<AMFactory> theFactory;
ServicesMap services_;
};
}
}

【问题讨论】:

  • 当然会破坏二进制兼容性。不管是不是private 都无所谓。一个成员就是一个成员,添加一个成员会改变对象的大小,更不用说过时的用户现在会使“未知成员”未初始化,等等。
  • @underscore_d :如果我将我的班级更改为单例,它是否仍然未初始化“未知成员”?
  • 我不明白将其设为单例会如何影响这一点,但是对于所提出的主要问题也无关紧要:您仍然会破坏 ABI 并向所有调用代码引入未定义的行为。
  • @underscore_d:如果对象创建本身是通过同一个类的静态函数发生的,那么为什么它会使“未知成员”未初始化?可能是我在这里没有得到清晰的画面。
  • 好的,我想使用 create 方法可以解决未初始化的成员,但这是您在像这样破坏 ABI 时最不担心的问题。

标签: c++ c++11


【解决方案1】:

现在我想向我的班级添加一个新的私有成员变量。这会破坏二进制兼容性吗?

类的大小会改变,因此是的,它会破坏二进制兼容性。

如果它坏了,那么是否有破解之法。就我而言,我不希望重新编译用户应用程序。

不是我所知道的。这也是我们在开始实施之前专注于设计的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2018-12-27
    • 2016-08-20
    • 1970-01-01
    • 2013-03-08
    • 2012-09-24
    • 2010-12-08
    相关资源
    最近更新 更多