C++编程技巧降低编译时间

1. #define的保护

全部头文件都应该使用#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;
};

这时候再生成一次,能够看到例如以下情况

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

能够看到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没改动之前做一次编译。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

相同我们在A中增加私有成员后再编译一次。

能够看到这里仅仅编译了A.cpp文件。

这样的原因就是事实上是C++的声明与定义并未全然分离的缘故。像Java就不会有这样的问题=。

=

时间: 2024-10-23 19:32:29

C++编程技巧降低编译时间的相关文章

C++编程技巧减少编译时间

1. #define的保护 所有头文件都应该使用#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

单片机应用编程技巧问答

1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言.其主要优点是占用资源少.程序执行效率高.但是不同的CPU,其汇编语言可能有所差异,所以不易移植. C语言是一种结构化的高级语言.其优点是可读性好,移植容易,是普遍使用的一种计算机语言.缺点是占用资源较多,执行效率没有汇编高. 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM.RAM.STACK等资源都有限,如果使用C语言编写,一条C语言指令编译

VC/MFC 编程技巧大总结

1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐:<java编程思想> 4 在VC下执行DOS命令 a. system("md c:\\12"); b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE); c. ShellExecute ShellExecute(NULL,

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

ZStack中的编程技巧

1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x)      do { x } while (__LINE__ == -1) 例如:#define aps_GroupsRemaingCapacity() ( APS_MAX_GROUPS - aps_CountAllGroups() ) 上述的这个宏,调用的其他函数来实现其功能,因此,不适合使用st()宏. 使用场景:  aps_Grou

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen

java命名规范和编程技巧

一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用一个小写字母开头,后面的单词用大写字母开头. Static Final 变量的命名  Static Final 变量的名字应该都大写,并且指出完整含义. 参数的命名

Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之--找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数.本文就带你揭开这些谜团. 声明,这篇文章是需要一点点混合编程基础的,基本概念和过程要懂一点,如果能简单成功混编一个简单的计算或者绘图例子

Matlab.NET混合编程技巧之——找出Matlab内置函数

原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MWArray.dll,呵呵,它不允许,不代表你不会哦).经过很多项目,和大量的实验,也发现了一些小技巧和小秘密,今天就分享其中一个,先做一个