[英]Comparing pimpl idiom with Microsoft COM
我知道这个话题在StackOverflow上有点偏离主题。 但是我只是想不出另一个更合适的发布位置,我真的很想收集你们的意见。
最近,我遇到了pimpl习惯用法 。 我认为它与Microsoft的组件对象模型(COM)有关 ,并试图对两者进行比较。 这样的比较应该有助于理解,我想确保自己做对了。 因此,如果您在比较中发现任何误解或需要补充,请随时将其发布为答案。 比较如下:
由于COM接口仅使用虚函数,因此用户代码可以独立地编译和链接,而无需以任何方式引用实现。 这使实现的二进制模块(即Windows上的.dll
和Linux上的.so
)可以在进程运行期间.so
动态加载(例如,通过对Windows平台上的LoadLibrary()
显式调用)。 使用pimpl惯用语时,类方法不一定是虚拟的,并且用户代码链接必须引用实现,否则将存在未解析的外部符号引用。 此外,必须在操作系统启动程序的进程启动时隐式完成实现二进制模块的加载。
pimpl习惯用法允许直接在用户代码中实例化实现对象。 但是,对于COM,必须使用工厂函数来获取指向实现对象的指针。
两者都是对代码中允许的构造的自愿限制,以实现特定目标。
两者的共同之处在于它们在纯数据结构(不能包含方法)和对象接口(不能包含数据成员)之间进行硬区分。
另外,COM还要求数据和接口参数可序列化(有一些例外,例如IUnknown
不是),并且还为使用GUID的类和二进制接口引入了第二种命名约定,用于指定数据结构和虚函数表布局。
pimpl习惯用法还使用工厂类-pimpl类创建实际的实现。 COM只是显式地将它们称为工厂类,并允许对象的重用(例如,工厂类提供单例仅返回对自身的引用是合法的)。
就个人而言,我认为没有必要使用pimpl习惯用法。 拥有实现指针的类是一个相当冗长的智能指针类,它显式复制所有方法,并且它相对于auto_ptr
,具有virtual
析构函数的抽象类提供的唯一优势是它允许使用.
而不是->
访问方法。
COM添加了新功能:
编组方面是最重要的方面,因为被调用方的执行上下文可能是提供系统服务的不同特权进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.