使用G ++

时间:2017-07-28 05:34:53

标签: c++ gcc g++

我正在练习建立链接列表,并考虑将我的功能分成单独的文件,并将所有内容与主文件分离。

这是我提出的文件结构

./
    functions
        printlist.cpp
        functionbcd.cpp
    functions.h
    LinkedList.cpp
    Node.h

LinkedList.cpp中的头文件

#include "functions.h"
#include <bits/stdc++.h>
using namespace std;

functions.h中的头文件

#include <bits/stdc++.h>
#include "Node.h"

&#34中的头文件;已实现的任何功能&#34; .cpp

#include <bits/stdc++.h>
#include "..\functions.h"
using namespace std;

编译命令

g++ -ggdb -O2 -std=c++14 LinkedList.cpp functions\*.cpp

现在如果我保留上面提到的结构,我的编译时间比我保留的结构多4-5倍,并在main文件中定义所有函数。

我无法理解这一点。

如果有更好的方法来构建我的文件并改善编译时间,请告诉我们。

谢谢。

1 个答案:

答案 0 :(得分:1)

每个文件都有固定的开销,即为每个文件启动实际的编译器,包括解析&#34;公共部分&#34; (即库包括)和链接器必须执行的一些每个文件的工作量。

鉴于您编写的实际代码很少,每个文件的时间成本实际上大致总是相同,并且大致相当于此固定开销;所以,你所看到的行为并不奇怪。

基于两个原因,分离到不同的文件开始在性能方面有意义:

  • 增量构建;如果你有一个大项目(有一个体面的构建系统)并触摸一个文件,它只会重建相应的对象模块(+ link),这比每次编译一个巨大的文件要快;
  • 并行构建; C ++编译器通常是单线程(这并不奇怪,因为它们的大部分工作都是严格顺序的),因此单个文件的编译无法利用当前CPU提供的并行性;但是如果你将你的项目拆分成单独的文件,那么问题会变得令人尴尬地平行,因为每个TU的编译完全独立于其他TU(目标模块仅在最后由链接器连接在一起);因此,在多核上构建时,拆分多个文件会很快得到回报。

(除了明显分离不同模块/类的文件所带来的明显的可维护性优势)