关闭

减少C++代码编译时间的方法

发表于:2015-8-27 09:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:还在想啊    来源:51Testing软件测试网采编

  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实现方式再详细分析下,期待吧…
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号