c++ - 使用许多外部类型声明时如何加快编译时间

标签 c++ xcode compilation extern performance

项目:

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 ,我可以做些什么来减少编译时间?

我的一些想法:

  1. 使用脚本将所有myType定义成一大myTypes.cpp文件并删除 extern 语句。

  2. 使用脚本来 #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/

相关文章:

ios - 如何创建枚举类型的 IBInspectable

iphone - 为什么 self.editing 和 self.tableView.editing 工作相同/正常?

mysql - 如何设置 Netbeans 以使用 C 语言进行 MySQL 编程

c - 左值需要作为一元 '&' 操作数

c++ - 视觉 C++ 2008;将库添加到编译过程?

c++ - 如何从我的项目 CMakeLists.txt 构建 gtest 静态库?

c++ - 在代码中复制 GLM::perspective

java - 为什么要避免在 Java 中使用 C++ 关键字?

c++ - 带有模板函数和 'using namespace' 的 VS2008(+?) 编译器错误

iphone - NSPredicate - 基于 BOOLEAN 存储值过滤值