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

    =




  • 相关阅读:
    格式控制符
    sort快速排序法
    堆积排序
    oracle常用命令
    C#中int和System.Int32理解总结
    IIS 7.5中的配置
    WPF循序渐进:XAML入门 .
    怎样找到excel两列之间同行相同的数据
    pl/sql functions and cbo costing
    Oracle 学习纲要
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7367448.html
Copyright © 2011-2022 走看看