gpt4 book ai didi

c++ - 为什么概念会使 C++ 编译速度变慢?

转载 作者:行者123 更新时间:2023-12-03 06:59:45 27 4
gpt4 key购买 nike

它到底想施展什么邪恶的魔法!?!

我正在听Q&A session with herb sutter其中一个问题是关于概念的。 Herb 提到它使编译器变慢(而源代码保持不变),并且该部分比模板部分大得多。

为什么要这样做?我在哪里可以找到有关概念的文档?

最佳答案

注意:以下答案(及其回答的问题)涉及旧的 C++0x 版本概念,与 C++20 中添加的功能版本关系不大。

<小时/>

首先,Herb 并没有说概念本身会使编译速度变慢。他说,概念化 C++ 标准库会使任何使用 C++ 标准库的代码编译速度变慢。

造成这种情况的原因有几个。

1:约束模板需要编译时间。

当你声明这样的类时:

template<typename T> class Foo {...};

编译器只是简单地解析 Foo 并且执行很少的操作。即使使用两阶段查找,编译器在类 Foo 的编译中也不会执行大量操作。当然,它会存储它供以后使用,但初始传递相对较快。

当您确实用概念约束模板时:

template<ConceptName C> class Foo {...};

编译器必须做一些事情。它必须预先检查类型 C 的每次使用是否符合概念 ConceptName。这是编译器将推迟到实例化时间的额外工作。

您进行的概念检查越多,用于验证类型是否与概念匹配的编译时间就越多。

2:标准C++库使用了很多概念。

看看迭代器概念的数量:输入、输出、正向、双向、顺序、连续。委员会正在考虑将它们分解为更多的部分。许多算法对于不同的迭代器概念会有多个版本。

这不包括范围概念(除了输出之外,每种迭代器概念都有一个范围概念)、std::string 的字符概念以及各种其他类型的概念。所有这些都必须进行编译和检查。

<小时/>

要使其快速运行,真正需要的概念是模块。编译器能够生成包含一系列预先检查的符号的模块文件,然后直接加载该文件,而无需经过标准编译过程。直接从解析到符号创建。

记住:对于您 #include 的每个 .cpp 文件,编译器必须读取该文件并编译它。尽管每次执行此操作时文件都是相同的内容,但它仍然必须尽职尽责地读取文件并处理它。如果我们谈论的是概念化的 std::vector,它必须对模板进行所有概念检查。它仍然需要执行编译时执行的所有标准符号查找。等等。

想象一下,如果编译器不必这样做。想象一下,如果它可以直接从磁盘加载一堆符号和定义。根本不需要编译;只是引入符号和定义供其他代码使用。

这就像预编译头一样,只是更好。预编译 header 仅限于每个 .cpp 文件一个,而您可以根据需要使用任意多个模块。

遗憾的是,模块在这个过程的早期就被从 C++0x 中拉了出来。如果没有模块,用概念约束标准库的编译速度总是比不受约束的版本慢。

请注意,Herb 误解了模块的用途(这并不难,因为该功能的大多数最初概念都是他谈论的内容:跨平台 DLL 等)。它们的核心根本目的是帮助编译时间,而不是使跨平台 DLL 工作。模块本身也不是跨平台的。

关于c++ - 为什么概念会使 C++ 编译速度变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com