تحسين Lambda والوظائف المضمنة: ميزة المترجم
بيان نيكولاي جوسوتيس بأن لامدا تظهر تحسينًا فائقًا للمترجم مقارنة بالوظائف العادية وقد أثار اهتمام الكثيرين المطورين. من خلال التحقيق في هذا الادعاء، نسعى لكشف الأسباب الكامنة وراء ميزة التحسين هذه.
الكائنات الوظيفية والبطانة
تمتلك Lambdas، كونها كائنات وظيفية، ميزة رئيسية: تمريرها إلى تؤدي قوالب الوظائف إلى إنشاء مثيل لوظيفة مخصصة خصيصًا لذلك lambda. يسمح هذا للمترجم بتضمين استدعاء لامدا بسهولة.
في المقابل، تستخدم الوظائف مؤشرات الوظائف عند تمريرها إلى قوالب الوظائف. تقليديًا، يواجه المترجمون تحديات تتضمن الاستدعاءات من خلال مؤشرات الوظائف. لا يكون التحسين المضمن ممكنًا إلا إذا كانت الوظيفة المضمنة نفسها مضمنة.
إنشاءات القالب: استكشاف الفرق
لتوضيح هذا التباين، ضع في اعتبارك قالب وظيفة الخريطة:
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() ويمكنه تضمين الاستدعاءات إليها مباشرة. يطالب كل نوع لامدا مميز بإنشاء مثيل جديد للخريطة، مما يضمن التحسين الخاص بلامدا.
في المقابل، يؤدي استدعاء الخريطة باستخدام مؤشر دالة إلى إنشاء مثيل جديد:
template void map(int* begin, int* end, int (*f)(int)) { for (; begin != end; begin) *begin = f(*begin); }
هنا، يشير مؤشر الوظيفة f إلى عناوين مختلفة لكل استدعاء خريطة، مما يمنع التحسين المضمن. يجب أن يكون الاستدعاء للتعيين مضمنًا حتى يتمكن المترجم من حل f لوظيفة معينة.
وبالتالي، فإن تمييز lambdas ككائنات وظيفية وقدرتها على تسهيل إنشاء مثيلات القالب يمكّن المترجمين من إمكانات تحسين أكبر من استدعاء الوظائف التقليدية من خلال المؤشرات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3