繁体   English   中英

#包括 <iostream> 在C ++中?

[英]#include <iostream> in C++?

我读到#include <file>会在编译之前通过C ++预处理器将粘贴“文件”复制到我们的源文件中。

这是否意味着只要我们编译源文件,“file”( iostream )也会一次又一次地编译?

在C ++完成它的工作之后,中间文件的大小也会有“文件”+“源文件大小”的字节吗?

我读到#include <file>会在编译之前通过C ++预处理器将粘贴“文件”复制到我们的源文件中。

是。 编译器正确看到的数据将包含file的数据和源文件中的数据。 (实际上,如今真正的编译器倾向于将C预处理器和编译器前端以及编译器后端合并到一个程序中 - 但这非常详细。)

这是否意味着只要我们编译源文件,“file”(iostream)也会一次又一次地编译?

是。 有些编译器有一个叫做“预编译头”的功能,它允许你编译一堆头文件,然后多次使用它的输出。 如何执行此操作因编译器而异; 如果你需要可移植性,不要担心它(它不会对编译时间产生很大的影响)。

在C ++完成它的工作之后,中间文件的大小也会有“文件”+“源文件大小”的字节吗?

不可以。输出文件的大小与源文件的大小非常微弱相关。 例如, #include <iostream>定义了许多内联函数。 任何特定的程序只会使用极少数 - 因此它们将从编译器输出中省略。

注释(使用源文件中的空格)不会出现在输出中。

另一方面,如果您编写一个复杂的模板,然后为几种不同的类型实例化它,那么输出将包含每种类型的模板的不同副本,并且可能比输入大很多。

关于中间文件大小的大小,是的,它会增加。 您可以通过编写一个简单的hello world程序来检查这一点,然后按如下方式编译它(在Linux中)

g++ name.cpp -o name --save-temps

这将存储中间文件,具体为:

"name.ii" (Preprocessed code after including <iostream>
"name.s"  (Assembly version of the code)
"name.o"  (Object code)

使用以下方法检查此文件大小的差异:

ls -l name.cpp name.ii

编号库(标题) 不会增加文件的大小,因为编译器不会将所有标题添加到您的代码中。它只是将您在代码中使用的内容添加到代码中,

不,它不会增加程序大小。 文件iostream和许多其他头文件没有可编译的语句。 它们包含您编程所需的一些定义。 如果查看预处理的C / C ++文件,您将看到在文件开头添加了数千个定义。

您可以使用cpp工具尝试它,使用命令运行它,就像普通的g ++ / gcc一样,并查看输出。

cpp -I /usr/include/ -I. file.cpp -o file.preprocessed

它只包含标题和定义,它们不会增加最终的程序大小。

编辑 :正如马丁所说,他们有可编辑的内联函数,每次都会编译,但除非你使用它们,否则它们不会增加你的程序大小。

我读到#include <file>会在编译之前通过C ++预处理器将粘贴“文件”复制到我们的源文件中。

它比那更微妙。 #include "file"执行您所描述的内容。 #include <file>拉入一个不需要是文件的标题 这个想法是编译器可以有自己的内部版本的头,已经是二进制形式,所以它不必读取和解析文件。 如果没有带有该名称的标头,则它将include伪指令视为#include "file"并查找要读取的文件。

在实践中,我不知道利用这个余地的编译器; 事实上,所有标题都是一遍又一遍地编译的文件。 但是,正如其他人所说,这本身并不意味着可执行文件变得更大。 理想情况下,如果您不使用它,它不会进入可执行文件,尽管有些系统比其他系统更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM