项目:
xcode 中的 C++ 编程。我有超过 3,000 多个类型定义分布在 2,000 多个 .c/.h 文件中。每个myType
类型包含字符串描述。我使用脚本定义了一个 map<std::string, myType>
.cpp
中的 3,000 多个元素用于查找 myType
的文件类型以传递给处理数据的函数,该函数基于 myType
传递给它。因为myType
定义分布在 2,000 多个文件中,我使用一个脚本来编写每个 extern myType TYPENAME;
在头文件中。
概述:
(2,000 多个 .c
文件具有 myType
定义)
myTypes.h
(包含上述文件中每个 myType
的所有 extern myType
语句)
myTypes.cpp
(包含上述文件中3000+个元素的map<std::string, myType>
)
typeProcessor.cpp
(包括 myTypes.h
。使用 myTypes.cpp
中定义的映射将字符串与 myType
匹配。将 myType
传递给下面文件中的函数)
dataProcessor.cpp
(根据传递给它的 myType
处理数据)
问题:
自从我添加了 myTypes.h
有 3,000 多个外部语句和 myTypes.cpp
使用包含 3,000 多个元素的 map ,我的项目编译时间从 20 秒延长到 1-1.5 小时。
我的问题:
无需触及 2,000 多个文件或 dataProcessor.cpp
收到 myType
,我可以做些什么来减少编译时间?
我的一些想法:
使用脚本将所有
myType
定义成一大myTypes.cpp
文件并删除 extern 语句。 或使用脚本来
#include
包含myType
的 2,000 多个文件中的每一个定义
我不太了解编译器,编译时间的主要因素,以及如何编写代码以最小化编译时间。任何帮助表示赞赏。谢谢。
最佳答案
无论您可以/已经做多少事情来更好地构建您的代码,为什么不呢
- 创建一个公共(public)静态注册函数,例如(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 中,调用注册函数。这样一个类型就可以注册自己,并且类型映射不需要“知道所有类型”。这是一种简单形式的依赖倒置
关键在于,没有文件需要包含注册过程的所有类型 header 。如果您需要特定于子类型的接口(interface)(例如,在 map 元素上使用
dynamic_cast<subtype>
时),您仍然需要包含(选定的)类型 header
附言。我假设 myType 有某种通用的基类型(因为您无法通过其他方式编译 std::map<std::string, myType>
)
更新
编辑
- 是的,你可以制作
registerTypeMapping
一个extern "C"
函数(只需编辑原型(prototype)使其符合 C 规范) - 对于每个
type_xx.h/type_xx.c
combi 你总是可以生成一个额外的源文件type_xx_register.c
包括只是那个类型并注册它。
请注意,这将导致更多 源,但可能会减少编译时间。特别是,如果你有一个 makefile 并且只编译 type_xx_register.o
对象文件当它的依赖项真正改变时。
那样的话,只有typemap.h
的变化会导致重新编译所有这些文件。
<子> 也不是不可能,一个简单的
$CC type*_register.cpp -o
_将比一次编译包含所有 type_xx.h 的单个源代码更快_
关于c++ - 使用许多外部类型声明时如何加快编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6601047/