【发布时间】:2019-10-07 01:15:49
【问题描述】:
背景
在C 和C++ 中,头文件是允许类定义(以及其他实体)在文件之间相同的文件。当另一个文件需要这些头文件中的功能时,#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