2012-03-19 47 views
0

我有一大堆的代碼,我需要分析,我不知道該怎麼辦。我有一堆代碼,這裏和那裏都使用了我的IDE中包含的稱爲math.h的頭文件中的數學函數。我被要求看看有多少空間被用來包含這個。具體來說就是編譯器包含了所有的庫函數或者我們使用的函數。沒有正在創建的對象文件。所以我認爲庫代碼正在被編譯到單個文件中。任何想法都可以用這種方法來解決這個問題?我不能僅僅評論包含的內容,因爲代碼不會編譯,我不會知道它的大小,如果我註釋掉所有使用數學函數的行,它並不具有真正的代表性。確定由庫函數使用的空間用C

回答

0

可以使用objdump命令來查看你的目標文件內的單個符號和他們所需要的空間。

需要注意的是,除非你在做靜態編譯,庫方法一般不被複制到你的生產二進制文件,但只是引用(和加載程序時通過動態鏈接帶來的)。

由於math.h是標準C庫的一部分,該庫的副本基本上保證始終在內存中,因此動態鏈接上額外的內存和空間要求很小。 (在靜態鏈接過程中,所有不是你的程序直接需要的符號都會被丟棄,數學函數也不會很大,所以使用量也應該相當小)。

+0

我在哪裏使用該命令?那是我添加到構建流程中的東西嗎?我相信我正在使用靜態構建,但我會檢查。 – user1054210 2012-03-19 19:06:49

+0

@ user1054210 objdump的是從任何合理的(即,非Windows)機器上的命令行安裝了開發工具鏈GNU的binutils的一部分,這將在安裝和使用。 – 2012-03-19 19:29:25

+0

大聲笑我正在使用win 7開發者工具。我正在爲贏得8臺機器的嵌入式系統工作...... Doh。我在7中編程並在8中進行調試......但我會嘗試查看是否從我的7機器上的命令行運行。 -Thanks – user1054210 2012-03-19 19:41:29

0

在頭文件中的代碼被編譯成你正在使用,如果你的頭有功能的定義,只是被引用到,如果他們只是在聲明中.C的目標文件。然後,鏈接器將爲每個符號找到一個定義,並將其放置在可執行文件中,如果您使用動態鏈接,操作系統將在運行時拉入定義。

+0

沒有操作系統,這是一個靜態編譯... – user1054210 2012-03-19 19:12:24

+0

所以交易是我需要證明其他的數學函數沒有被編譯到我的文件。所以我想我可以添加,讓50行代碼使用相同的數學函數和變量並編譯,然後對50個不同的數學函數進行相同的操作,即使我重複使用相同的變量,我也應該看到大小增加。那麼證明(如果我使用的是其他地方沒有使用過的新函數)只有被使用的函數纔會被添加...或者有更好的方法嗎? – user1054210 2012-03-19 19:12:24

+0

沒有一個好的方法來做到這一點。特別是一旦你考慮優化,可能會內聯你的電話。根據我的理解,沒有任何電話不會添加到您的對象中。你可以告訴這個,因爲你可以添加一個函數的聲明而不是調用它,你不會得到一個鏈接器錯誤。 – rerun 2012-03-19 19:20:41