[英]Is it beneficial to make library functions templated to avoid compiler instructions?
假設我正在名稱空間l
創建我自己的庫。 使盡可能多的命名空間成員模板化是否有益? 這將鼓勵編譯器只為庫用戶實際調用的成員生成指令。 為了說明我的觀點,我將在這里演示:
1)
namespace l{
template <typename = void>
int f() { return 3; }
}
對比
2)
namespace l{
int f() { return 3; }
}
沒有在 main 中調用它來顯示差異。
int main() { return EXIT_SUCCESS; }
函數 1) 不需要額外的l::f()
指令:
main:
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], 0
mov eax, 0
pop rbp
ret
函數 2) 確實需要額外的l::f()
指令(如果再次未調用l::f()
):
l::f()
push rbp
mov rbp, rsp
mov eax, 3
pop rbp
ret
main:
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], 0
mov eax, 0
pop rbp
ret
tl;博士
使庫函數模板化以避免編譯器指令是否有益?
不。發出死代碼不是編譯的昂貴部分。 文件訪問、解析和優化(不一定按這個順序)需要時間,這個想法迫使庫客戶端讀取和解析比常規頭 + 庫模型更多的代碼。
模板通常被歸咎於減緩構建,而不是加速構建。
這也意味着您無法提前構建庫,因此每個用戶都需要在使用它們的每個翻譯單元中從頭開始編譯他們使用的任何部分。
對於模板化版本,編譯所花費的總時間可能會更長。 您必須進行概要分析才能確定(我懷疑這個f
太小以至於無法測量),但我很難將其視為有用的改進。
無論如何,您的比較並不具有代表性 - 一個好的編譯器會在鏈接時丟棄死代碼。 有些還能夠內聯靜態庫中的代碼,因此對編譯時或運行時性能沒有可靠的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.