簡體   English   中英

鏈接器是否可以報告未使用的成員函數? (C ++)(GCC)

[英]Can unused member functions be reported by the linker? (C++)(gcc)

std :: string有30多個可以在字符串對象上調用的成員函數。
如果我只使用其中一些怎么辦?

我假設未使用的成員函數不會占用可執行代碼部分中的空間。
我很想知道鏈接器是否有可能確定一個未使用的成員函數,將其從編譯后的二進制文件中刪除,並報告它丟棄了哪些函數
有沒有辦法做到這一點? 我在看gcc的鏈接器標志 ,但我找不到任何相關的東西。

由於std::string是一個模板類( std::string只是std::basic_string<char>一個typedef ),所以只會實例化使用過的方法,因此不會編譯任何未使用的方法,因此它們不能從您的可執行文件中刪除。

關於非模板類: virtual函數總是以可執行文件結尾,無論它們是否被調用,因為vtable需要地址。 來自可執行文件源或靜態鏈接庫的其他方法(以及自由函數)只有在實際使用時才會鏈接到二進制文件中。 但我知道沒有鏈接器標志來打印尚未鏈接的函數。

另一方面,共享庫(.so)必須包括所有(導出的)函數和方法,因為使用此共享庫的二進制文件可以使用任何(導出的)函數。 但是,由於共享庫可以被許多可執行文件使用,而只被加載到內存中一次,這通常是值得的。

標准庫通常是共享的,因此它不會占用可執行文件中的任何空間。

如果您靜態鏈接,那么,就鏈接器而言,非虛擬成員函數只是具有有趣名稱的常規花園多樣性函數。 無論鏈接器可以對普通函數執行什么操作,它都可以與非虛擬成員一起使用。 我認為GNU LD可能能夠刪除某些體系結構上未使用的函數,但不能刪除其他體系結構。

當然,函數模板,例如std::string的成員是完全不同的故事。 對於鏈接器,它們根本不是來自庫,而是來自您的對象(只有那些您實例化的對象)。

這個答案並不完全涵蓋你的情況,但如果你想知道你的類是否有任何未調用的函數,一些靜態分析工具如cppcheck會報告這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM