我有一大堆的代碼,我需要分析,我不知道該怎麼辦。我有一堆代碼,這裏和那裏都使用了我的IDE中包含的稱爲math.h的頭文件中的數學函數。我被要求看看有多少空間被用來包含這個。具體來說就是編譯器包含了所有的庫函數或者我們使用的函數。沒有正在創建的對象文件。所以我認爲庫代碼正在被編譯到單個文件中。任何想法都可以用這種方法來解決這個問題?我不能僅僅評論包含的內容,因爲代碼不會編譯,我不會知道它的大小,如果我註釋掉所有使用數學函數的行,它並不具有真正的代表性。確定由庫函數使用的空間用C
回答
可以使用objdump
命令來查看你的目標文件內的單個符號和他們所需要的空間。
需要注意的是,除非你在做靜態編譯,庫方法一般不被複制到你的生產二進制文件,但只是引用(和加載程序時通過動態鏈接帶來的)。
由於math.h
是標準C庫的一部分,該庫的副本基本上保證始終在內存中,因此動態鏈接上額外的內存和空間要求很小。 (在靜態鏈接過程中,所有不是你的程序直接需要的符號都會被丟棄,數學函數也不會很大,所以使用量也應該相當小)。
在頭文件中的代碼被編譯成你正在使用,如果你的頭有功能的定義,只是被引用到,如果他們只是在聲明中.C的目標文件。然後,鏈接器將爲每個符號找到一個定義,並將其放置在可執行文件中,如果您使用動態鏈接,操作系統將在運行時拉入定義。
沒有操作系統,這是一個靜態編譯... – user1054210 2012-03-19 19:12:24
所以交易是我需要證明其他的數學函數沒有被編譯到我的文件。所以我想我可以添加,讓50行代碼使用相同的數學函數和變量並編譯,然後對50個不同的數學函數進行相同的操作,即使我重複使用相同的變量,我也應該看到大小增加。那麼證明(如果我使用的是其他地方沒有使用過的新函數)只有被使用的函數纔會被添加...或者有更好的方法嗎? – user1054210 2012-03-19 19:12:24
沒有一個好的方法來做到這一點。特別是一旦你考慮優化,可能會內聯你的電話。根據我的理解,沒有任何電話不會添加到您的對象中。你可以告訴這個,因爲你可以添加一個函數的聲明而不是調用它,你不會得到一個鏈接器錯誤。 – rerun 2012-03-19 19:20:41
- 1. 如何編寫由用戶空間函數調用的內核空間函數?
- 2. 確定真空後的可用空間
- 3. C++庫創建使用命名空間
- 4. 使用由LC_LOAD_DYLIB加載的動態庫來設置C函數
- 5. 特定時間的C#調用函數
- 6. 正確使用cpp文件中函數定義的命名空間
- 7. 確定遞歸函數的時間和空間複雜度
- 8. C++命名空間函數
- 9. 正確使用c#暴露VB類庫中的函數#
- 10. 確定C#文件的名稱空間
- 11. C程序的空間確定
- 12. 使用C調用一個按鈕的自定義庫函數
- 13. 使用strtok函數刪除Tab空間
- 14. 在C++中使用函數的時間
- 15. 使用c庫函數的系統時間設置
- 16. 使用時鐘確定函數的運行時間()
- 17. 自由的空間分配使用malloc
- 18. 使用(顯然)空C函數
- 19. 在C++中正確使用PlaySound函數
- 20. 正確使用析構函數c#
- 21. opencv命名空間和c,C++函數
- 22. C++使用空間聲明
- 23. 如何使用參數確定使用JavaScript函數的變量
- 24. 確定內存中函數/存根/名稱空間的大小
- 25. 你如何確定函數的名稱空間?
- 26. 正確定義具有匿名函數的名稱空間
- 27. 在C++類命名空間中調用C函數
- 28. 使用C運行時庫函數只
- 29. rails使用link_to命名空間路由
- 30. 無法使用由C++中的函數返回的數組
我在哪裏使用該命令?那是我添加到構建流程中的東西嗎?我相信我正在使用靜態構建,但我會檢查。 – user1054210 2012-03-19 19:06:49
@ user1054210 objdump的是從任何合理的(即,非Windows)機器上的命令行安裝了開發工具鏈GNU的binutils的一部分,這將在安裝和使用。 – 2012-03-19 19:29:25
大聲笑我正在使用win 7開發者工具。我正在爲贏得8臺機器的嵌入式系統工作...... Doh。我在7中編程並在8中進行調試......但我會嘗試查看是否從我的7機器上的命令行運行。 -Thanks – user1054210 2012-03-19 19:41:29