1

我正在开发一个 COM 风格的编译器交叉兼容插件框架,它依赖于兼容的虚拟表实现来实现 ABI 兼容性。我定义了只包含纯虚成员函数和重写的删除操作符的接口,以将破坏引导到实现的地方。这适用于外部“C”工厂函数实例化接口的插件实现并返回接口类型指针。

但是,我想知道智能指针是否不是管理插件对象生命周期的更现代的方式。我想我实际上已经设法创建了一个标准布局 shared_ptr/weak_ptr ,它使用与插件接口相同的方式定义和实现的引用计数对象。它看起来像这样:

class IRefCount
{
public:
  virtual void incRef() = 0;
  virtual void decRef() = 0;
  virtual bool incRefIfNZ() = 0;
  virtual void incWRef() = 0;
  virtual void decWRef() = 0;
  virtual long uses() const = 0;
protected:
  ~ref_count_base() = default; //prohibit automatic storage
}
template <typename Ty>
class shared_ptr
{
private:
   Ty* ptr_;
   IRefCount* ref_count_;
public:
   //member functions as defined by C++11 spec
}

三个问题:

在智能指针之前,工厂函数如下所示:

extern "C" IPlugin* factory() { try { return new Plugin(); } catch (...) { return nullptr; } }

现在,它看起来像这样:

extern "C" shared_ptr<IPlugin> factory() { try { return shared_ptr<IPlugin>(new Plugin()); } catch (...) { return nullptr; } }

VS2013 给我警告 C4190:'factory' 指定了 C 链接,但返回与 C 不兼容的 UDT 'shared_ptr'。根据 MSDN,只要调用者和被调用者都是 C++,就可以了。

  1. 从“C”链接函数返回标准布局对象是否还有其他潜在问题?

  2. 调用约定。我应该为所有纯虚拟接口函数和工厂函数指定 __stdcall 吗?

  3. 我正在使用<atomic>参考计数。我正在编写与平台无关的代码,但尚未尝试为 ARM 编译。根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s02s01.html armcc 没有实现 std::atomic。那里有更好的编译器/ stl吗?

4

0 回答 0