编译时间&大型C ++项目的内存使用情况?

时间:2012-05-03 22:49:17

标签: c++ linux

假设一个人有大约50,000个不同的.cpp个文件。

每个.cpp文件包含只有一个类,其中包含大约1000行代码(代码本身并不复杂 - 涉及矩阵和向量中的内存操作 - 即,没有使用特殊的库。)

我需要构建一个必须导入的项目(在Linux环境中)。使用所有这50,000个不同的.cpp文件。

我想到了几个问题:

  1. 编译它需要多长时间?什么是约。编译文件的大小?
  2. 什么是更好的方法 - 保留50,000个不同的.so文件(编译的扩展)并让主程序逐个导入它们,或者将这50,000个不同的.cpp文件合并到< em>一个大的 .cpp 文件,只是处理它?哪种方法更快/更有效?
  3. 任何见解都非常有用。

4 个答案:

答案 0 :(得分:2)

没有答案,只是建议。

回到你身边:你真的想做什么?你是不是想从不同的源文件创建一个代码库?或者这是一个可执行文件?你真的编码了很多.cpp文件吗?

50,000个源文件很好......一个大型项目。您是否尝试在所有文件中执行常见操作(例如,每个源文件代表资源,记录,图像或其他独特的内容)。或者它只是50K不同的代码文件?

您的大部分编译时间不会基于每个源文件的大小。它将基于每个cpp文件引入的头文件(以及它们包含的头)的数量。标题虽然通常不包含实现,但只是声明,必须经过编译过程。代码库中的冗余标头可能会减慢构建时间。

这种规模的大型项目使用precompiled headers。您可以将所有常用的头文件包含在一个头文件(common.h)中并构建common.h。然后所有其他源文件只包含“common.h”。编译器可以配置为在看到每个源的#include“common.h”时自动使用编译的头文件。

答案 1 :(得分:0)

您可以使用“.h”文件构建每个目标文件,其中“.h”文件具有许多(并且我很多)前向声明 - 所以当您更改.h文件时,它不需要重新编译程序的其余部分。通常,函数/方法需要在其parmaters中的对象名称或它正在撤回的内容。如果它需要其他细节 - 是的,它需要包括在内。

请Scott Myers写一本书 - 对你有很大的帮助。

哦 - 当我想吃一块大蛋糕时 - 把它分开了。切片更易于管理。

答案 2 :(得分:0)

(i)确定这个因素涉及太多因素,即使是近似也是不可能的。编译可以是内存,cpu或硬盘绑定。文件的复杂性很重要(根据您的描述,您的复杂性很低)。

(ii)这样做的典型方法是创建一个库,让系统找出链接或加载。您可以选择静态或动态链接。

静态链接
假设您使用的是gcc,它将如下所示:
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o
...
g++ -c filen.cpp -o filen.o
ar -rc libvector.a file1.o file2.o ... filen.o

然后,当您构建自己的代码时,您的最终链接如下所示:
g++ myfile.cpp libvector.a -o mytask

动态链接
同样,假设您使用gcc,这将是这样的:
g++ -c file1.cpp -fPIC -o file1.o
g++ -c file2.cpp -fPIC -o file2.o
...
g++ -c filen.cpp -fPIC -o filen.o
ld -G file1.o file2.o ... filen.o -o libvector.so

然后,当您构建自己的代码时,您的最终链接如下所示:
g++ myfile.cpp libvector.so -o mytask
您将需要libvector.so位于加载程序的路径中,以使您的可执行文件正常工作。

在任何情况下,只要50,000个文件没有改变,你只需要做最后一个命令(这会更快)。

答案 3 :(得分:0)

我们无法真正说出编译所需的时间,但您应该做的是将每个.cpp / .h对编译成.o文件:

$ g++ -c -o test.o test.cpp ...

完成所有这些后,您将编译主程序:

$ g++ -c -o main.o main.cpp
$ g++ -o main main.o test.o blah.o otherThings.o foo.o bar.o baz.o etc...

您使用.so的想法几乎是在问“我有多快可以使程序崩溃,可能还会破坏操作系统?”。共享库适用于少量的大型库,而不是50,000 .so个链接到二进制文件(尤其是,如果你动态加载它们......那将是 BAD )。