该项目:

xcode中的C ++编程。我有超过3,000多个类型定义,分布在2,000多个.c / .h文件中。每个myType类型都包含一个字符串描述。我使用脚本在map<std::string, myType>文件中定义了3,000多个元素的.cpp,用于查找myType类型,以将其传递给函数,该函数根据传递给它的myType处理数据。因为myType定义分布在2,000多个文件中,所以我使用脚本将每个extern myType TYPENAME;写入头文件中。

概述:

(2,000个具有.c定义的myType文件)

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

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

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

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

问题:

自从我添加了3,000多个extern语句的myTypes.h和具有3,000多个元素的映射的myTypes.cpp以来,我的项目编译时间从20秒延长到1-1.5小时。

我的问题:

在不触摸2,000多个文件或接收dataProcessor.cppmyType的情况下,我该怎么做以减少编译时间?

我有一些想法:


使用脚本将所有myType定义放入一个大的myTypes.cpp文件中,并删除extern语句。要么
使用脚本#include包含myType定义的2,000多个文件中的每个


我对编译器,编译时间的主要因素以及如何编写代码以最大程度地减少编译时间了解不多。任何帮助表示赞赏。谢谢。

最佳答案

无论可以做/已经做过很多事情来更好地构建代码,为什么不呢?


创建公共静态注册功能,例如(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>时),仍然需要包含(选定的)类型标题。


PS。我为myType假定了某种常见的基本类型(因为您无法通过std::map<std::string, myType>进行编译)

更新资料

编辑


是的,您可以将registerTypeMapping设为extern "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的单个源的编译要快_

10-07 19:32
查看更多