当使用许多外部类型声明时,如何加快编译时间?

How can I speed up compile time when using many extern type declarations

本文关键字:何加快 编译 时间 声明 许多外 类型      更新时间:2023-10-16

项目:

c++ Programming in xcode我有3000多个类型定义,分布在2000多个。c/。h文件中。每种myType类型都包含一个字符串描述。我使用脚本在.cpp文件中定义3000 +元素的map<std::string, myType>,用于查找myType类型以传递给处理基于myType传递给它的数据的函数。因为myType的定义分布在2000多个文件中,所以我使用了一个脚本来在头文件中编写每个extern myType TYPENAME;

概述:

(2000 +具有myType定义的.c文件)

myTypes.h(包含上述文件中每个myType的所有外部myType语句)

myTypes.cpp(包含上述文件中3000多个元素的map<std::string, myType>)

typeProcessor.cpp(包括myTypes.h)。使用myTypes.cpp中定义的映射将字符串匹配到myType。将myType从下面的文件传递给一个函数)

dataProcessor.cpp(根据传递给它的myType处理数据)

问题:

由于我添加了myTypes.h与3000 + extern语句和myTypes.cpp与3000 +元素的映射,我的项目编译时间从20秒延长到1-1.5小时。

我的问题:

在不触及2,000多个文件或接收myTypedataProcessor.cpp的情况下,我可以做些什么来减少编译时间?

我的一些想法:

  1. 使用脚本将所有myType定义放入一个大的myTypes.cpp文件中,并删除外部语句。

  2. 使用脚本#include每个包含myType定义的2000多个文件

我不太了解编译器,编译时间的主要因素,以及如何编写代码来最小化编译时间。任何帮助都是感激的。谢谢你。

不管你可以做很多事情来更好地构建你的代码,为什么你不

  • 创建一个公共静态注册函数,例如(typemap.h)

.

std::map<std::string, myTypeBase>& getGlobalTypeMap();
# define getGlobalTypeMap _once_ in typemap.cpp !
template <class myType>
  registerTypeMapping(std::string name, const myType& instance)
  {
       getGlobalTypeMap().insert(name, instance);
  }
  • 在类型定义的每个.cpp中,调用注册函数。通过这种方式,类型注册自己,并且不需要类型映射"知道所有类型"。这是依赖倒置,以一个简单的形式

  • 关键是,没有文件需要包含注册过程中的所有类型头文件。如果你需要特定于子类型的接口(例如,当在地图元素上使用dynamic_cast<subtype>时),你仍然需要包括(选定的)类型标题

p。我假设myType有某种共同的基本类型(因为没有办法让std::map<std::string, myType>编译)

更新

编辑

  • 是的,您可以使registerTypeMappingextern "C"函数(只需编辑原型使其符合c)
  • 对于每个type_xx.h/type_xx.c组合,您总是可以生成一个额外的源文件type_xx_register.c,其中包含只是该类型并注册它。

注意,这将导致更多的源,但可能会减少编译时间。特别是,如果您有一个makefile,并且只在type_xx_register.o对象文件的依赖关系真正改变时才编译它。

这样,只有在typemap.h中进行更改才会导致重新编译所有这些文件。

<子>一个简单的

$CC type*_register.cpp -o 

_会比一次性编译包含所有type_xx.h的单个源代码_要快

由于所有这些文件都没有发生太大变化(我假设),因此要么是解析3000多行头文件,要么是链接,这会消耗编译时间。如果它是解析,预编译头应该解决这个问题,如果它是链接,像Visual Studio的增量链接应该有所帮助,但我不认为任何编译器除了MSVC有这个能力(纠正我,如果我错了)。

这可能会阻止保存这3,000个文件

与xcode的autosave方法相反

这个autosave off选项(非常愚蠢)在新版本的xcode(3.1是一个坚实的xcode)中缺失,因此所有文件都得到一个新的时间戳,然后相当于一个干净的所有重建。

尝试make在命令行上不保存文件作为速度比较