是否可以并行编译单个C ++翻译单元?
如果是这样,怎么样? (具体如何使用例如clang或gcc)
否则,为什么不呢?
答案 0 :(得分:2)
我非常怀疑可以并行编译。
C和C ++语言取决于评估顺序。文件中较高的#define可能会更改其后的所有内容的含义。在C ++中,操作符可能会调用函数或执行其他操作,具体取决于操作符覆盖函数的存在。实际上,如果将符号名称解释为变量或类型,则符号名称的存在与否可能会受到影响。
可以在不参考符号表的情况下并行完成的解析的简单部分很容易做到,因此线程化它们几乎没有意义。硬部件本质上是序列化的。
语言可能被设计为允许在单个单元中进行并行编译,但它不是C。
答案 1 :(得分:1)
可能在理论上,但在实践中毫无意义。
预处理程序线程可以发出一系列要编译的标记,实际的编译线程可以在生成它们时选择它们。类似地,链接器线程可以在生成时提供编译函数,因为它可以在最后一个函数已知之前启动。
窥孔优化也可以并行完成,几乎可以定义。但这需要与其他优化步骤(如内联)交替进行,这在并行方面有点难度。
但正如评论所指出的那样,任何真正的程序都有比你拥有核心更多的翻译单元。你需要为一个TU同步两个线程,这就浪费了时间。
链接当然是完全不同的事情。