std::string例如,如果我只想使用,那么导入(理论上的)std::string模块不是比导入整个标准库更有效吗?

是否为了易于使用,因为您必须自己构建标准库模块,并且将所需的每个单独的组件构建到模块中会很繁琐?

或者是由于创建模块(任何大小)的某种开销,如果导入足够多的小模块,它最终会比导入一个大模块更昂贵?

10

  • 总体而言,速度差异应该很小。注意:它只是声明(并经过预解析,因此不再需要读取大量文件并需要大量解析的 #include)。它与链接和向最终程序添加代码无关。


    – 

  • 1
    std::string 使用 std::allocator 例如放置新运算符,因此这意味着您将需要所有 C++ 标准库。您可以将其静态链接,这样最终的可执行文件将仅包含它真正使用的函数,无论如何不建议这样做。将标准 C++ 库拆分为最小模块是对 C++ 25 标准的提议。


    – 

  • 12
    的阴谋


    – 


  • 3
    您所看到的只是标准在不断发展,有些部分还在进行中。#include自 C++98 以来(之前),C++ 标准库 via 就允许包含子集。模块是一个相对较新的功能,允许导入标准库的子集是一项正在进行的工作。添加/修改/删除标准部分的标准化过程并非一蹴而就 – 有一个强制性的过程 – 从提案开始,审议和发展该提案,纳入标准草案,并最终获得批准。


    – 


  • 2
    @DavidGrayson 我只指一种导入语句 – 即import。我的比较是在import std;和假设之间进行的import std.string;


    – 


最佳答案
2

例如,如果我只想使用 std::string,那么导入(理论上的) std::string 模块的性能不是比导入整个标准库更高吗?

模块的工作方式并非如此。模块导入不同于头文件包含。模块导入的成本与模块中的内容数量不成比例。

导入模块意味着编译器会读取一些二进制数据,说明哪些名称可用。但模块的整个编译代码不需要仅从导入中读取。当您使用模块导出名称的实体时,编译器可以跳转到编译模块文件的该部分以找出其中的内容。

3

  • 有没有关于这种特殊行为的参考?


    – 

  • 1
    @PasserBy:标准中的引用?标准规定了可见的行为,而不是性能。所以这超出了标准的范围。但是,在将所有内容放入单个模块的提案中提到了模块导入的实现方式,并且他们在几种实现上进行了测试,没有明显的性能损失。


    – 

  • 我知道标准中不会有任何内容,我指的是诸如提案之类的内容,或者可能是编译器作者的演讲。我之所以问这个问题,是因为你会认为这是人们需要了解的一个主要功能。


    – 


根据新标准,你只需要导入 std。但这并不意味着整个 STL 都会添加到你的二进制文件中。你的编译器应该对其进行优化,并“切断”所有无用的链接。