C++编程技巧降低编译时间
全部头文件都应该使用#define 防止头文件被多重包括(multiple inclusion)。命名格式
当是:<PROJECT>_<PATH>_<FILE>_H_
为保证唯一性,头文件的命名应基于其所在项目源码树的全路径。比如,项目foo 中的头
文件foo/src/bar/baz.h 按例如以下方式保护:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
2. 头文件依赖
使用前置声明(forward declarations)尽量降低.h 文件里#include 的数量。
当一个头文件被包括的同一时候也引入了一项新的依赖(dependency),仅仅要该头文件被改动。
代码就要又一次编译。假设你的头文件包括了其它头文件。这些头文件的不论什么改变也将导致那
些包括了你的头文件的代码又一次编译。
因此,我们宁可尽量少包括头文件。尤其是那些包括
在其它头文件里的。
使用前置声明能够显著降低须要包括的头文件数量。
举例说明:头文件里用到类File。但不
须要訪问File 的声明,则头文件里仅仅需前置声明class File;无需#include
"file/base/file.h"。
在头文件怎样做到使用类Foo 而无需訪问类的定义?
1) 将数据成员类型声明为Foo *或Foo &;
2) 參数、返回值类型为Foo 的函数仅仅是声明(但不定义实现);
3) 静态数据成员的类型能够被声明为Foo,由于静态数据成员的定义在类定义之外。
还有一方面,假设你的类是Foo 的子类,或者含有类型为Foo 的非静态数据成员,则必须为
之包括头文件。
有时。使用指针成员(pointer members。假设是scoped_ptr 更好)替代对象成员(object
members)的确更有意义。
然而,这种做法会减少代码可读性及运行效率。假设只为
了少包括头文件。还是不要这样替代的好。
当然,.cc 文件不管怎样都须要所使用类的定义部分,自然也就会包括若干头文件。
译者注:能依赖声明的就不要依赖定义。
以上是Google中C++编程规范的前两条要求。第一条相信大家都知道。第二条就是我要说的问题了。
这里我用VS2012解释下这个事情。要降低编译的目的就是要降低#include;
那我们先定义这样两个类:
#pragma once class A { public: A(void); ~A(void); };
#pragma once #include "A.h" class B { public: B(void); ~B(void); private: A a; };
能够看到这是非常easy的组合类的情况。B类中有个A的对象。以下我们生成一下。
这时候A。B第一次编译成功
接下来我们改动对象A,在对象A中添加一个私有成员i,B不变;
#pragma once class A { public: A(void); ~A(void); private: int i; };
这时候再生成一次,能够看到例如以下情况
能够看到A编译后。编译器发现B中导入了A.h然后又编译了一次B。
在project量比較小的时候这么做是没关系的。但当你编译一次代码须要1分钟2分钟的时候。我们频繁的改动源代码然后编译你会崩溃的是不是?
所以前置声明是一个能够选择的解决方式。
B的代码仅仅要做例如以下改动,取消导入A.h在B.h中声明class A;
#pragma once class A; class B { public: B(void); ~B(void); private A* a; };
我们相同在A没改动之前做一次编译。
相同我们在A中增加私有成员后再编译一次。
能够看到这里仅仅编译了A.cpp文件。
这样的原因就是事实上是C++的声明与定义并未全然分离的缘故。像Java就不会有这样的问题=。
=
相关文章
- 学 C/C++ 编程的必要软件你都装了不?
- 托管C++线程锁实现 c++11线程池
- VC++动态链接库(DLL)编程深入浅出(四)
- VS2010设置C++包含目录和库目录
- 84 C++ - 内建函数对象
- 82 C++ - 函数对象
- C++程序设计:原理与实践(进阶篇)17.8 让图形程序运行起来
- C++类对象的创建与释放过程详解
- Google C++ Style Guide在C++11普及后的变化
- 《C++多线程编程实战》——2.4 进程的实现
- 《C++游戏编程入门(第4版)》——1.7 使用常量
- 《C++编程风格(修订版)》——导读
- 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——第 1 章 MATLAB数字图像处理编程基础2.1 MATLAB R2011a简介
- 《C++面向对象高效编程(第2版)》——第2章 什么是数据抽象
- 《C++面向对象高效编程(第2版)》——2.8 确定封装的内容
- 《C++面向对象高效编程(第2版)》——2.25 统一建模语言(UML)
- 《C和C++代码精粹》——第 2 章 指针2.1 容易出错的编程
- 《C++编程惯用法——高级程序员常用方法和技巧》——第1章 抽象
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.3 请考虑边界条件
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.3 请考虑边界条件
- 《C++编程惯用法——高级程序员常用方法和技巧》——第2章 类
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.10 小结
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.11 问题
- 《C++编程惯用法——高级程序员常用方法和技巧》导读
- C++ 编码规范整理
- 纪念逝去的岁月——C/C++排序二叉树
- 【C++】类和对象&封装
- C++编程——引用
- Linux编程中的坑——C++中exit和return的区别
- WindowsclientC/C++编程规范“建议”——函数
- C++一个简单的手柄类模板
- 蓝桥杯练习题十三 - 第几个幸运数(c++)
- 编程参考 - C++ 术语说明 Defined Terms - 1