zoukankan      html  css  js  c++  java
  • 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;
    };
    

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



    能够看到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就不会有这样的问题=。

    =




  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7367448.html
Copyright © 2011-2022 走看看