為什麼Lambda 在編譯器最佳化方面優於函數
Nicolai Josuttis 在他的書《C 標準庫(第二版)》中聲稱lambda與普通函數相比,享受卓越的編譯器最佳化。這種差異源自於 lambda 作為函數物件的本質,允許針對特定 lambda 物件進行函數模板實例化。
Lambda 的內聯優勢
與普通函數不同,它將函數指標傳遞給函數模板,lambda 作為函數物件傳遞。這會觸發針對特定 lambda 物件自訂的新函數的建立。因此,編譯器可以毫不費力地內聯 lambda 調用。
函數指標阻礙
相反,函數會受到函數模板中傳遞機制的阻礙。編譯器在透過函數指標進行內聯調用方面面臨挑戰。雖然理論上內聯是可能的,但它也需要內聯封閉函數。
實例化範例
考慮下面的函數範本「map」:
使用lambda 呼叫「map」:
產生以下實例化:
編譯器辨識lambda 的operator() 並且可以輕鬆內聯呼叫
但是,當使用函數指標呼叫「map」時:
每次呼叫「map」時,函數指標「f」都指向不同的位置,使得編譯器單獨內聯「f」呼叫是很困難的。內聯還需要內聯包含的“map”調用,使編譯器能夠確定“f”指向的特定函數。
以上是為什麼 Lambda 在編譯器最佳化方面比函數有內聯優勢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!