Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 标题编译得更快?_C_Header_Compiler Construction - Fatal编程技术网

C 标题编译得更快?

C 标题编译得更快?,c,header,compiler-construction,C,Header,Compiler Construction,我想更深入地探讨为什么要使用标题,经过一些研究,我发现了一些令人信服的答案,但在大多数回答中,人们说这会加快编译速度,但所有这些答案都很模糊,没有确切说明标题如何使编译更容易。 有人能更深入地探讨这个问题吗? 谢谢。忘记编译速度吧。问题是软件的可维护性 标题意味着包含不同源在编译时需要的内容,通常定义构成API的常量和函数声明。忘记编译速度。问题是软件的可维护性 头意味着包含不同源在编译时需要的内容,通常是定义构成API的常量和函数声明。如果从头开始编译,将项目划分为头并不会提高编译速度 然而,

我想更深入地探讨为什么要使用标题,经过一些研究,我发现了一些令人信服的答案,但在大多数回答中,人们说这会加快编译速度,但所有这些答案都很模糊,没有确切说明标题如何使编译更容易。 有人能更深入地探讨这个问题吗?
谢谢。

忘记编译速度吧。问题是软件的可维护性


标题意味着包含不同源在编译时需要的内容,通常定义构成API的常量和函数声明。

忘记编译速度。问题是软件的可维护性


头意味着包含不同源在编译时需要的内容,通常是定义构成API的常量和函数声明。

如果从头开始编译,将项目划分为头并不会提高编译速度

然而,它们使得修改代码的速度大大加快。项目的编译通常是这样的。首先,将每个文件编译成具有相对地址的机器代码(因此代码的起始地址未知)。然后链接所有其他文件以创建项目

假设您有一个包含10.000个文件的项目。如果仅更改1个文件,则在生成项目时仅编译该文件,然后将链接所有其他文件。如果尚未将项目划分为10.000个文件,则在构建简单更改时,必须编译所有其他10.000个文件。因此,一旦编译了项目,使用这种方法进行调试的速度就会大大加快


此外,编译文件是一个单线程程序。因此,您可以通过同时编译多个文件来并行提高编译速度
-j
标记用于
make
命令执行此操作。

如果从头开始编译,将项目划分为标题不会提高编译速度

然而,它们使得修改代码的速度大大加快。项目的编译通常是这样的。首先,将每个文件编译成具有相对地址的机器代码(因此代码的起始地址未知)。然后链接所有其他文件以创建项目

假设您有一个包含10.000个文件的项目。如果仅更改1个文件,则在生成项目时仅编译该文件,然后将链接所有其他文件。如果尚未将项目划分为10.000个文件,则在构建简单更改时,必须编译所有其他10.000个文件。因此,一旦编译了项目,使用这种方法进行调试的速度就会大大加快

此外,编译文件是一个单线程程序。因此,您可以通过同时编译多个文件来并行提高编译速度
-j
标记用于
make
命令执行此操作。

一些编译器(实际上只是MSVC)可以利用使用预编译头的优势。这实际上意味着,如果在每个编译单元的开头都有相同的include文件,那么您可以告诉编译器只处理一次,而对于其他编译单元,只能在include之后立即开始处理

如果您看到项目中有一个
stdafx.h
头,这个头在整个项目中引入了很多其他常用的头,那么它就是这样

其他编译器(如gcc或clang)处理源代码的速度要快得多,因此缓存这样一个不完整的表示还没有什么好处


除了预编译头之外,它们还充当编译单元之间的公共接口。在用模板来描述C++时,或者通过模板生成代码时,C在编译阶段只对生成的符号的可见性进行限制,只对特定的编译单元进行限制。为了在接下来的链接阶段限制可见性,可以使用
static
关键字

实际上,这并不会影响大多数项目。事实上,对于较小的项目,一种常见的技术实际上是在编译之前将所有编译单元合并,这样就可以在编译时消除分离,而无需专门的链接步骤。如果合并的编译单元中的静态符号没有冲突,那么这实际上比在头中严格使用最小接口节省了更多的编译时间

根据实际经验估计,一旦在单个编译单元中看到超过50-100k的符号,出于编译器性能原因,您需要开始降低可见性。

一些编译器(实际上只是MSVC)可以从使用预编译头中获得很好的利用。这实际上意味着,如果在每个编译单元的开头都有相同的include文件,那么您可以告诉编译器只处理一次,而对于其他编译单元,只能在include之后立即开始处理

如果您看到项目中有一个
stdafx.h
头,这个头在整个项目中引入了很多其他常用的头,那么它就是这样

其他编译器(如gcc或clang)处理源代码的速度要快得多,因此缓存这样一个不完整的表示还没有什么好处


除了预编译头之外,它们还充当编译单元之间的公共接口。在用模板来描述C++时,或者通过模板生成代码时,C在编译阶段只对生成的符号的可见性进行限制,只对特定的编译单元进行限制。为了在接下来的链接阶段限制可见性,可以使用
static
关键字

实际上,这并不会影响大多数项目。事实上,对于较小的项目,一种常见的技术实际上是在编译之前将所有编译单元合并,这样就可以在编译时消除分离,而无需