」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 Lambda 比 C++ 中的普通函數更可優化?

為什麼 Lambda 比 C++ 中的普通函數更可優化?

發佈於2024-11-16
瀏覽:319

Why are Lambdas More Optimizable than Plain Functions in C  ?

與普通函數相比,為什麼Lambda 允許增強編譯器優化

Nicolai Josuttis 的C 標準庫(第二版)斷言lambda可以與普通函數相比,編譯器可以更有效地最佳化。這項優勢源自於 lambda 作為函數物件的本質。

當 lambda 傳遞給函數模板時,它會被實例化為專門針對該物件定制的新函數。這使得編譯器可以毫不費力地內聯 lambda 呼叫。相反,對於普通函數,函數指標將傳遞給函數模板。傳統上,編譯器在透過函數指標進行內聯呼叫時遇到困難。

為了說明這個概念,請考慮以下函數模板:

template 
void 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