2012-05-28 114 views
0

我想問一下,如果我包含更多的頭文件,它會增加所需的RAM大小嗎?例如,如果我#include <stdio.h>#include <string.h>需要更多的RAM嗎?C:#include增加內存大小?

我寫與CNU C編譯器的嵌入式系統軟件,所以我希望儘量減少需要儘可能的RAM。

+1

增加編譯程序所需的RAM大小或增加編譯器本身所需的RAM大小? – jamesdlin

+0

我的意思是我正在編譯的程序所需的RAM大小,我在微控制器中只有64KB內部RAM,並且我總是擔心RAM耗盡,因爲它很難調試... – eepty

+0

哇第一個地方我覺得我的問題看起來很愚蠢和微不足道,我想知道我應該問這個問題嗎......但現在我認爲值得問這麼多不同的答案和評論...... – eepty

回答

0

不,包含文件是針對編譯器的;它們根本不影響生成的代碼的大小。

0

號包含文件都沒有的功能,它們對系統函數的引用(至少是對於那些來到你的編譯器的那些)。如果您想自己查看,請導航至編譯器的include目錄,並在文本編輯器中打開這些文件(但切勿改變它們)。它們與您編寫的任何其他.h相同;他們沒有定義任何功能。

編譯器將看到該函數的名稱(例如:printf的)是有效的把它編譯成目標文件。鏈接器負責將該名稱轉換爲有效的系統調用。

+0

我看到你使用內核這個詞。我不認爲這意味着你的想法。 – Enno

+0

@Enno更改爲系統 –

+0

想知道相同:)我認爲他的意思是「核心」,而不是。或者可能是我錯了。系統功能是錯誤的,因爲有些功能指向更高層次的功能。 –

0

標題包含僅在編譯期間有效。它們用於告訴編譯器他可以在哪裏找到他需要的實現。

編譯的可執行文件不包含這些信息,因此不受包含數量的影響。

這與PHP等解釋型語言有很大的區別,其中包含文件會增加內存使用量。但是,即使在PHP有,最大限度地減少內存使用的機制(包括文件一次,但不包括未使用的包括...)

1

這個問題的答案,你真的要問什麼是可能是「沒有」,至少當你在談論關於標準庫頭文件。包括它們對於可執行文件大小或內存佔用量不會產生影響。然而,我無法抗拒給予了相反的迴應:

這取決於什麼在你的包含文件。系統頭文件不會這樣做,但理論上,任何文件都可以在這個文件中。頭只包含函數原型和類型定義只是一個約定。如果我有這兩個文件:

// foo.c 
int bigarray[1000]; 

// bar.c 
#include "foo.c" 
int main(int argc, char**argv()) { 
return 0; 
} 

這是合法的代碼和bar.c將很好地編譯,但是我的內存佔用很可能是4K因爲較大foo.c中的數組(如果編譯器沒有優化它)。

+0

此代碼不包含頭文件。任何試圖包含.c文件的人都只能責怪自己。除此之外,編譯器不太可能在可執行文件中包含「bigarray」。 – Lundin

+1

「頭文件」是C語言中的慣例。編譯器不關心你給文件命名的內容或你寫的內容。另外,我確實說過我試圖違背:-)至於在可執行文件中不包含bigarray,請嘗試以下代碼:gcc -o bar bar.c && nm bar | grep bigarray – Enno

+0

編譯器接受什麼並不重要,因爲OP特別詢問如果它們包含頭文件並且代碼沒有這樣做會發生什麼,所以它不回答這個問題。在沒有啓用任何優化的情況下運行編譯器也不相關。 – Lundin

-1

是的,但只是稍微..但它確實會增加CPU使用率。您可以在Windows任務管理器中查看它....

+1

我認爲OP很明顯是指可執行文件的RAM消耗,而不是編譯器的RAM消耗。此外,問題中沒有任何內容表示代碼是在MS Windows上編譯的。 – Lundin

0

是的,我可能會增加二進制文件的大小,然後增加RAM大小。 它有兩種方式: 1.頭文件具有全局/靜態變量定義 2.頭文件具有即使它不用於當前文件的功能。但編譯器仍然可以將它們保留在最終的二進制文件中

我說「可能會增加」,因爲如果編譯器足夠聰明,我只能包含必要的二進制數據,而放棄另一些。

的也許在頭文件中的其他內容,如變量聲明,類型定義等等。他們不會增加內存,因爲它只需要編譯時間,而不是運行時間。

+0

如果這些全局變量/靜態變量被程序實際使用,編譯器很可能只會將它們保留在最終的二進制文件中。此外,標準庫頭文件通常由熟練的專業程序員編寫,因此您不會在頭文件中找到任何全局變量/靜態變量。 – Lundin

+0

@Lundin我在說這個概率。我不是圖書館的作家,所以我不是他們寫的。你不是,所以你不知道乙醚。 – RolandXu

+0

Err ...其實我是。大部分編譯器都將它們的頭文件完全開放源碼 – Lundin