【发布时间】:2015-10-05 13:00:46
【问题描述】:
我知道这个话题在 StackOverflow 上有点离题。但是我实在想不出另一个更合适的地方来发帖,我真的很想收集你们的意见。
最近,我遇到了pimpl idiom。我认为这与微软的Component Object Model (COM)有关,并试图对两者进行比较。这样的比较应该有利于理解,我想确保我做对了。因此,如果您在比较中发现任何误解或有任何补充,请随时将其发布为答案。对比如下:
相似之处:
- 这两个接口都从二进制实现中解耦 等级。因此,更改实现不需要 重新编译用户代码。
区别:
由于 COM 接口只使用虚函数,用户代码可以 独立编译和链接,无需参考 以任何方式实施。这使二进制模块(即
.dll在 Windows 上和.so在 Linux 上)的实现是 在进程运行期间根据需要动态加载(例如,通过 在 Windows 平台上显式调用LoadLibrary())。随着 pimpl 成语,类方法不一定是虚拟的,用户 代码链接必须引用实现,否则会有 未解析的外部符号引用。此外,加载 实现二进制模块必须在进程中隐式完成 由操作系统加载程序启动。pimpl 习惯用法允许直接实例化实现对象 在用户代码中。但是,对于 COM,必须使用工厂函数 获取指向实现对象的指针。
- 虽然 COM 设计为与编译器无关,但 pimpl 习惯用法不是 因为名字修改等等。
【问题讨论】:
-
我投票决定将此问题作为离题结束,因为它可能更适合作为 wiki 主题
-
@Roy 关于我应该在哪里发布这样的内容有什么建议吗?
-
遗憾的是没有。我确实将鼠标悬停在 “属于另一个站点” 单选按钮选项上,但想不出一个。除此之外,我认为这不是一个坏的问题。 :)
-
PIMPL 的目标很简单:隐藏类的实现细节以获得更好的封装。 COM 更加宏大:它使对象能够支持多个接口,并允许这些对象存在于同一个可执行文件、DLL、不同的可执行文件或完全不同的机器上,而无需了解调用代码的区别。
-
@MarkRansom 我同意。 COM 比 pimpl 成语要全面得多。我主要关注二进制接口(防火墙)方面。无论如何,您是否发现问题中给出的差异有任何误解?
标签: c++ interface com dynamic-linking pimpl-idiom