繁体   English   中英

pimpl习惯用法与Microsoft COM比较

[英]Comparing pimpl idiom with Microsoft COM

我知道这个话题在StackOverflow上有点偏离主题。 但是我只是想不出另一个更合适的发布位置,我真的很想收集你们的意见。

最近,我遇到了pimpl习惯用法 我认为它与Microsoft的组件对象模型(COM)有关 ,并试图对两者进行比较。 这样的比较应该有助于理解,我想确保自己做对了。 因此,如果您在比较中发现任何误解或需要补充,请随时将其发布为答案。 比较如下:

相似点:

  1. 两个接口都从二进制级别解耦实现。 因此,更改实现不需要重新编译用户代码。

区别:

  1. 由于COM接口仅使用虚函数,因此用户代码可以独立地编译和链接,而无需以任何方式引用实现。 这使实现的二进制模块(即Windows上的.dll和Linux上的.so )可以在进程运行期间.so动态加载(例如,通过对Windows平台上的LoadLibrary()显式调用)。 使用pimpl惯用语时,类方法不一定是虚拟的,并且用户代码链接必须引用实现,否则将存在未解析的外部符号引用。 此外,必须在操作系统启动程序的进程启动时隐式完成实现二进制模块的加载。

  2. pimpl习惯用法允许直接在用户代码中实例化实现对象。 但是,对于COM,必须使用工厂函数来获取指向实现对象的指针。

  3. 尽管COM被设计为与编译器无关,但是pimpl习惯并不是因为名称修改等原因。

两者都是对代码中允许的构造的自愿限制,以实现特定目标。

两者的共同之处在于它们在纯数据结构(不能包含方法)和对象接口(不能包含数据成员)之间进行硬区分。

另外,COM还要求数据和接口参数可序列化(有一些例外,例如IUnknown不是),并且还为使用GUID的类和二进制接口引入了第二种命名约定,用于指定数据结构和虚函数表布局。

pimpl习惯用法还使用工厂类-pimpl类创建实际的实现。 COM只是显式地将它们称为工厂类,并允许对象的重用(例如,工厂类提供单例仅返回对自身的引用是合法的)。

就个人而言,我认为没有必要使用pimpl习惯用法。 拥有实现指针的类是一个相当冗长的智能指针类,它显式复制所有方法,并且它相对于auto_ptr ,具有virtual析构函数的抽象类提供的唯一优势是它允许使用. 而不是->访问方法。

COM添加了新功能:

  • 方法调用可以编组并传输到不同的执行上下文
  • 所有对象都包含一个引用计数器,该计数器允许在非合作上下文之间共享对象
  • 运行时调度是通过GUID执行的,只要仍然可以识别旧的GUID并加载兼容层,就可以更改接口定义而不会出现兼容性问题。
  • 对象可以由不同的子对象组成,但是对于调用者来说,它是一个更大的单个对象。
  • 通用二进制接口和内存分配限制允许在使用不同编译器生成的代码之间进行调用,甚至可以针对运行时的不同实现进行链接

编组方面是最重要的方面,因为被调用方的执行上下文可能是提供系统服务的不同特权进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM