【问题标题】:What is the time cost for the preprocessor for each #include directive? [closed]每个#include 指令的预处理器的时间成本是多少? [关闭]
【发布时间】:2019-10-07 01:15:49
【问题描述】:

背景

CC++ 中,头文件是允许类定义(以及其他实体)在文件之间相同的文件。当另一个文件需要这些头文件中的功能时,#include 以下列三种方式之一使用:

#include <stdio.h>         // Include the contents of the standard header 
                           // 'stdio.h' (probably a file 'stdio.h').
#include <vector>          // Include the contents of the standard header 
                           // 'vector' (probably a file 'vector.h').
#include "user_defined.h"  // Include the contents of the file 'user_defined.h'.

在每种情况下,预处理器都会将文本从头文件复制到#include 所在的文件中。鉴于头文件的普遍流行,我很好奇添加到头文件包含的复制粘贴方法中的时间。因此我的问题......

问题:预处理器用文本替换它遇到的所有#include 指令的时间成本是多少?

【问题讨论】:

  • 其中最大的部分通常应该是查找(搜索包含目录)和读取文件所需的时间。
  • 这在很大程度上取决于它遇到的#include 指令的数量,不是吗?
  • @DeiDei 希望 C++20 模块能更好...
  • 成本是打开文件和关闭文件,仅此而已。预处理器包含不能通过替换文本来工作——编译器不会在内存中构建一个包含所有文本(甚至是预处理器标记,这是大多数预处理操作的级别)的数组并替换它的一部分。它编译翻译单元就像包含的文件被包含在内。通常,这只需要打开文件并从中读取,就像从原始文件中读取一样。编译器只是正常读取;它不需要做任何替换。
  • “添加时间”中的另一个因素是比较的基础。头文件包括声明和类型定义,它们通常是正确调用其他编译单元或库中的函数所必需的。避免使用头文件意味着程序员必须添加头文件将提供的所需声明 - 除了容易出错之外,这会增加人力,这对生产力的影响比编译器/预处理器解析头文件的时间更大。

标签: c++ c include c-preprocessor header-files


【解决方案1】:

从概念上讲,预处理器是编译 C 代码的一个独立步骤。处理预处理指令所需的原始时间将因编译器和操作系统而异。更改处理搜索顺序或将“后预处理器”输出作为单独文件输出的编译器选项也将更改所需时间。

您将主要受 I/O 时间的限制,因为即使使用 SSD,处理器/主内存也比 I/O 快得多。 I/O 处理将采取两种形式;搜索头文件并读取头文件。复杂的宏扩展也可能需要时间,但同样由于 I/O 和主内存速度的相对差异,这通常次要于实际查找和读取头文件。

大多数编译器允许您在不完全编译为二进制的情况下生成预处理器输出,并且大多数操作系统都有监控或分析进程/命令的方法。您可以使用这些功能大致了解所用时间以及 CPU/内存和 I/O 的使用方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多