减少C++代码编译时间的方法
作者:网络转载 发布时间:[ 2015/8/27 11:29:34 ] 推荐标签:测试开发技术 .NET
2. 删除不必要的一大堆私有成员变量,转而使用 “impl” 方法
2.1.使用 “impl” 实现方式写代码,减少客户端代码的编译依赖
impl 方法简单点说是把 类的私有成员变量全部放进一个impl 类, 然后把这个类的私有成员变量只保留一个impl* 指针,代码如下:
// file old.h
class old {
// 公有和保护成员
// public and protected members
private:
// 私有成员, 只要任意一个的头文件发生变化或成员个数增加,
// 减少,所有引用old.h的客户端必须重新编译
// private members; whenever these change,
// all client code must be recompiled
};
改写成这样:
// file old.h
class old {
// 公有和保护成员
// public and protected members
private:
class oldImpl* pimpl_;
// 替换原来的所有私有成员变量为这个impl指针,指针只需要前向声明可以编译通过,
// 这种写法将前向声明和定义指针放在了一起,完全可以。
// 当然,也可以分开写
// a pointer to a forward-declared class
};
// file old.cpp
struct oldImpl {
// 真正的成员变量隐藏在这里, 随意变化, 客户端的代码都不需要重新编译
// private members; fully hidden, can be
// changed at will without recompiling clients
};
不知道你看明白了没有, 看不明白请随便写个类试验下,我是这么做的,当然凡事也都有优缺点,下面简单对比下:
改为impl实现后是这样的:
// 只用 file and cx 有虚函数.
#include "file.h"
#include "db.h"
class cx;
class error;
class old : public file, private db {
public:
old( const cx& );
db get_db( int, char* );
cx get_cx( int, cx );
cx& fun1( db );
error fun2( error );
virtual std::ostream& print( std::ostream& ) const;
private:
class oldimpl* pimpl;
//此处前向声明和定义
};
inline std::ostream& operator<<( std::ostream& os,const old& old_val )
{ return old_val.print(os); }
//implementation file old.cpp
class oldimpl{
std::list<cx> cx_list_;
deduce dudece_d_;
};
3. 删除不必要的类之间的继承
面向对象提供了继承这种机制,但是继承不要滥用, old class 的继承属于滥用之一, class old 继承file 和 db 类, 继承file是公有继承,继承db 是私有继承
,继承file 可以理解, 因为file 中有虚函数, old 要重新定义它, 但是根据我们的假设, 只有file 和 cx 有虚函数,私有继承db 怎么解释?! 那么可能的理由是:
通过 私有继承—让某个类不能当作基类去派生其他类,类似Java里final关键字的功能,但是从实例看,显然没有这个用意, 所以这个私有继承完全不必要, 应该改用包含的方式去使用db类提供的功能, 这样可以
把”db.h”头文件删除, 把db 的实例也可以放进impl类中,终得到的类是这样的:
// 只用 file and cx 有虚函数.
#include "file.h"
class cx;
class error;
class db;
class old : public file {
public:
old( const cx& );
db get_db( int, char* );
cx get_cx( int, cx );
cx& fun1( db );
error fun2( error );
virtual std::ostream& print( std::ostream& ) const;
private:
class oldimpl* pimpl;
//此处前向声明和定义
};
inline std::ostream& operator<<( std::ostream& os,const old& old_val )
{ return old_val.print(os); }
//implementation file old.cpp
class oldimpl{
std::list<cx> cx_list_;
deduce dudece_d_;
};
小结一下:
这篇文章只是简单的介绍了减少编译时间的几个办法:
1. 删除不必要的#include,替代办法 使用前向声明 (forward declared )
2. 删除不必要的一大堆私有成员变量,转而使用 “impl” 方法
3. 删除不必要的类之间的继承
这几条希望对您有所帮助, 如果我哪里讲的不够清楚也可以参考附件,哪里有完整的实例,也欢迎您发表评论, 大家一起讨论进步,哦不,加薪。 呵呵,在下篇文章我将把impl实现方式再详细分析下,期待吧…
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11