與普通函數相比,為什麼Lambda 允許增強編譯器優化
Nicolai Josuttis 的C 標準庫(第二版)斷言lambda可以與普通函數相比,編譯器可以更有效地最佳化。這項優勢源自於 lambda 作為函數物件的本質。
當 lambda 傳遞給函數模板時,它會被實例化為專門針對該物件定制的新函數。這使得編譯器可以毫不費力地內聯 lambda 呼叫。相反,對於普通函數,函數指標將傳遞給函數模板。傳統上,編譯器在透過函數指標進行內聯呼叫時遇到困難。
為了說明這個概念,請考慮以下函數模板:
templatevoid map(Iter begin, Iter end, F f) { for (; begin != end; begin) *begin = f(*begin); }
使用 lambda 呼叫此函數:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
結果是編譯器所建立的實例化:
template void map(int* begin, int* end, _some_lambda_type f) { for (; begin != end; begin) *begin = f.operator()(*begin); }
在這種情況下,編譯器可以存取 _some_lambda_type::operator() 並且可以無縫地內聯調用它。每個 lambda 都有不同的類型,因此在 map() 中使用不同的 lambda 將產生新的實例化。
但是,如果使用函數指標:
map(int* begin, int* end, int (*f)(int)) { for (; begin != end; begin) *begin = f(*begin); }
編譯器將無法內聯對 f 的調用,直到對 map() 的包含調用也被內聯,從而允許它精確定位特定函數。這凸顯了 lambda 在編譯器最佳化方面相對於普通函數的優勢。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3