Rumah > pembangunan bahagian belakang > C++ > Mengapakah Lambdas Lebih Dioptimumkan daripada Fungsi Biasa dalam C?

Mengapakah Lambdas Lebih Dioptimumkan daripada Fungsi Biasa dalam C?

Susan Sarandon
Lepaskan: 2024-11-24 06:00:19
asal
704 orang telah melayarinya

Why are Lambdas More Optimizable than Plain Functions in C  ?

Mengapa Lambdas Membenarkan Pengoptimuman Pengkompil yang Dipertingkatkan Berbanding dengan Fungsi Biasa

Perpustakaan Standard C (Edisi Kedua) oleh Nicolai Josuttis menegaskan bahawa lambdas boleh dioptimumkan dengan lebih berkesan oleh penyusun berbanding dengan fungsi biasa. Kelebihan ini berpunca daripada sifat lambda sebagai objek fungsi.

Apabila lambda dihantar ke templat fungsi, ia dijadikan seketika sebagai fungsi baharu yang disesuaikan khusus dengan objek tersebut. Ini membolehkan pengkompil untuk menyelaraskan panggilan lambda dengan mudah. Sebaliknya, dengan fungsi biasa, penunjuk fungsi dihantar ke templat fungsi. Secara tradisinya, penyusun menghadapi kesukaran untuk menyelaraskan panggilan yang dibuat melalui penuding fungsi.

Untuk menggambarkan konsep ini, pertimbangkan templat fungsi berikut:

template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}
Salin selepas log masuk

Menyebut fungsi ini dengan lambda:

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });
Salin selepas log masuk

menghasilkan instantiasi yang dicipta oleh pengkompil:

template <>
void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) {
    for (; begin != end; ++begin)
        *begin = f.operator()(*begin);
}
Salin selepas log masuk

Dalam kes ini, pengkompil mempunyai akses kepada _some_lambda_type::operator() dan boleh membuat panggilan sebaris dengan lancar. Setiap lambda mempunyai jenis yang berbeza, jadi menggunakan lambda yang berbeza dengan map() akan menghasilkan instantiasi baharu.

Walau bagaimanapun, jika penunjuk fungsi digunakan sebaliknya:

map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}
Salin selepas log masuk

Pengkompil akan tidak dapat menyelaraskan panggilan ke f sehingga panggilan merangkumi ke map() juga diselaraskan, membenarkannya untuk menentukan fungsi tertentu. Ini menyerlahkan kelebihan lambda berbanding fungsi biasa dari segi pengoptimuman pengkompil.

Atas ialah kandungan terperinci Mengapakah Lambdas Lebih Dioptimumkan daripada Fungsi Biasa dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan