"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تعتبر Lambdas أكثر قابلية للتحسين من الوظائف العادية في لغة C++؟

لماذا تعتبر Lambdas أكثر قابلية للتحسين من الوظائف العادية في لغة C++؟

تم النشر بتاريخ 2024-11-16
تصفح:851

Why are Lambdas More Optimizable than Plain Functions in C  ?

لماذا تسمح Lambdas بتحسين المترجم المحسن مقارنة بالوظائف العادية

تؤكد مكتبة C القياسية (الإصدار الثاني) بقلم نيكولاي جوسوتيس أن لامدا يمكنها ذلك يمكن تحسينها بشكل أكثر فعالية بواسطة المترجمين مقارنة بالوظائف العادية. تنبع هذه الميزة من طبيعة لامدا ككائنات وظيفية.

عندما يتم تمرير لامدا إلى قالب دالة، يتم إنشاء مثيل لها كوظيفة جديدة مصممة خصيصًا لذلك الكائن. وهذا يسمح للمترجم بتضمين استدعاء لامدا بسهولة. على العكس من ذلك، مع الوظائف العادية، يتم تمرير مؤشر دالة إلى قالب الوظيفة. تقليديًا، واجه المترجمون صعوبات في تضمين الاستدعاءات التي يتم إجراؤها من خلال مؤشرات الوظائف.

لتوضيح هذا المفهوم، خذ بعين الاعتبار قالب الوظيفة التالي:

template 
void map(Iter begin, Iter end, F f) {
    for (; begin != end;   begin)
        *begin = f(*begin);
}

استدعاء هذه الوظيفة باستخدام لامدا:

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() ويمكنه تضمين استدعاءاته بسهولة. كل لامدا لها نوع مميز، لذا فإن استخدام لامدا مختلفة مع Map() سيؤدي إلى إنشاء مثيل جديد.

ومع ذلك، إذا تم استخدام مؤشر دالة بدلاً من ذلك:

map(int* begin, int* end, int (*f)(int)) {
    for (; begin != end;   begin)
        *begin = f(*begin);
}

لن يتمكن المترجم من تضمين الاستدعاءات إلى f حتى يتم تضمين الاستدعاء الشامل لـ Map() أيضًا، مما يسمح له بتحديد وظيفة معينة. وهذا يسلط الضوء على ميزة لامدا على الوظائف العادية من حيث تحسين المترجم.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3