簡體   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