لماذا تسمح Lambdas بتحسين المترجم المحسن مقارنة بالوظائف العادية
تؤكد مكتبة C القياسية (الإصدار الثاني) بقلم نيكولاي جوسوتيس أن لامدا يمكنها ذلك يمكن تحسينها بشكل أكثر فعالية بواسطة المترجمين مقارنة بالوظائف العادية. تنبع هذه الميزة من طبيعة لامدا ككائنات وظيفية.
عندما يتم تمرير لامدا إلى قالب دالة، يتم إنشاء مثيل لها كوظيفة جديدة مصممة خصيصًا لذلك الكائن. وهذا يسمح للمترجم بتضمين استدعاء لامدا بسهولة. على العكس من ذلك، مع الوظائف العادية، يتم تمرير مؤشر دالة إلى قالب الوظيفة. تقليديًا، واجه المترجمون صعوبات في تضمين الاستدعاءات التي يتم إجراؤها من خلال مؤشرات الوظائف.
لتوضيح هذا المفهوم، خذ بعين الاعتبار قالب الوظيفة التالي:
templatevoid 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