pImpl
之前看代码,一直对pIml这个用法一知半解,参考这里
的一篇文章后有所收获。
总结一下,pIml的好处如下:
第一,引入更多的头文件降低编译速度。而且这个声明当然写在一个头文件里,而头文件,是不能预编译或增量编译的,
如果你因此而引入一个诸如<windows.h>之类的头文件,产生的代价可能是一杯咖啡的编译时间--而且每次编译都这样;
第 二,大大提高的模块的耦合度。在这里,CFooInternalData从此与 CFoo紧紧绑定。在一个库里的模块互相耦合当然可以忍受,
不过你要记得,这里有两种耦合度:一个是编译期的,一个是运行期的,这种方式下,无论编译还是 运行,它 们都耦合在一起,
只要 CFooInternalData 发生变更,CFoo 的模块也必须重新编译;
第三,降低了接口的稳定程 度。接口的稳定,至少有两个方面:一个是对于库的运用,即方法调用不能变;一个是对于库的编译,
即动态库的变更最好能让客户程序不用重编译。方法调用与这 个问题无关,但对于库的编译,如果CFooInternalData 变了,
客户程序显然必须重新编译,因为 private 部分,虽然对于客户程序不可用,但并不是不可见,尤其是对编译器来说。
对于一个动态链接库,这个问题可能会让人无法忍受。
pimpl 手法能比较完善的解决这些问题。
利用 pimpl 手法,我们把数据细节隐藏到一个实现类里:CFoo_pimpl,而 CFoo 的 private 部分只剩下一个指针,那就是传说中滴 pimpl 指针
pImpl的更多相关文章
- [021]转 C++ Pimpl机制
出处:http://www.cnblogs.com/gnuhpc/ 1.简介 这个机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们 ...
- 何为 pimpl ?
前言 你是否总因头文件包含冲突而苦恼? 你是否因头文件包含错乱而苦恼? 你是否因封装暴露了数据而苦恼? 你是否因经常改动实现而导致重新编译而苦恼? 在这里, 这些问题都不是问题, 跟随作者, 揭秘pi ...
- PIMPL设计模式的理解和使用
以下两段不同程序的比较 //file a.h #include "a.h" #include “ b.h” class A{ void Fun(); B b; } //file: ...
- 提高C++编译速度-------pimpl 模式& 桥接模式(转)
pimpl 模式(Private Implementation),我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这 ...
- C++ 编译期封装-Pimpl技术
Pimpl技术——编译期封装 Pimpl 意思为“具体实现的指针”(Pointer to Implementation), 它通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏, 是隐藏实 ...
- Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你曾经同过久的编译时间斗争过,那么你肯定对Pi ...
- 实现私有化(Pimpl) --- QT常见的设计模式
转载自:http://blog.sina.com.cn/s/blog_667102dd0100wxbi.html 一.遇到的问题 1.隐藏实现 我们在给客户端提供接口的时候只希望能暴露它的接口,而隐藏 ...
- PIMPL(二)
文档下载 上一篇文档,PIMPL(一) 1 如何使用PIMPL 有多种方式实现PIMPL,这里按照<Effective C++>中介绍的方式. 1.1 基本步骤 假设原有Person如下: ...
- PIMPL(一)
1 参考 <effective C++> 条款31:将文件间的编译关系降至最低 PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom 2 什么是PI ...
随机推荐
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- 【QuickHit项目实例】
关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...
- Kafka 如何读取offset topic内容 (__consumer_offsets)
众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并 ...
- 深度理解CSS样式表,内有彩蛋....
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JDBC关于时间的存取
Oracle数据库默认时间存储是java.sql.date,而java程序中的时间默认是java.util.date,所以通过JDBC存取的 时候会涉及到时间的转换问题. 1.日期存取 存入数据库的时 ...
- JAVA 问题集中之处以及解决的办法
也许当你看的时候,你可能认为这些都是简单的问题,有什么好记的.其实不是,我认为,我们往往是因为粗心而造成的错误,当你在开发中碰到这些问题时,你能一下看出来是什么错误,达到提高效率.而且往往你把小的问题 ...
- window下的各种宽高度小结
详细的请打开这里看console.log window.innerWidth: 文档显示区(body)的宽度window.innerHeight 文档显示区(body)的高度window.outr ...
- GDAL生成Erdas Imagine
GDAL原生支持超过100种栅格数据类型,涵盖所有主流GIS与RS数据格式,包括• ArcInfo grids, ArcSDE raster, Imagine, Idrisi, ENVI, GRAS ...
- iOS 学习 - 3.仿qq列表
完整代码放在 github 上面 https://github.com/slodier/SimilarQQ
- yii2实战教程之新手入门指南-简单博客管理系统
作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...