تمرير بالرجوع أكثر تكلفة من النجاح بالقيمة
-
22-09-2019 - |
سؤال
هل هناك حالة يكون فيها مرجع مرار على حدة أغلى من القيمة في C ++؟ إذا كان الأمر كذلك ، فماذا ستكون هذه الحالة؟
المحلول
تفضل تمرير الأنواع البدائية (int ، char ، float ، ...) وهياكل جرابية رخيصة للنسخ (نقطة ، معقدة) بالقيمة.
سيكون هذا أكثر كفاءة من عدم التوجيه المطلوب عند المرور بالرجوع إليه.
نرى تعزيز سمات المكالمات.
فئة القالب
call_traits<T>
يتغلف طريقة "أفضل" لتمرير معلمة من نوع T من أو من أو من وظيفة ، وتتكون من مجموعة من typedefs المحددة كما في الجدول أدناه. الغرض منcall_traits
هو التأكد من عدم حدوث مشاكل مثل "الإشارات إلى المراجع" ، وأن المعلمات يتم تمريرها بالطريقة الأكثر كفاءة الممكنة.
نصائح أخرى
يمكنك قراءة هذه المقالة "تريد السرعة؟ تمرير بالقيمة" حول نسخ Elision و RVO (إرجاع عن طريق تحسين القيمة). ويوضح أن المراجع تمنع في بعض الأحيان المترجم من القيام به.
نعم ، قد يتطلب الوصول إلى الوسيطة المرجعية مستويات أكثر من عدم التوجيه أكثر من الوسيطة القيمة. علاوة على ذلك ، قد يكون أبطأ إذا كان حجم الوسيطة أصغر من حجم مؤشر واحد. بالطبع ، كل شيء على افتراض أن المترجم لا يحسنه.
يمكن للمترجم تحسين تمرير نوع بدائي بالرجوع إلى مجرد المرور حسب القيمة ، إذا كان النوع هو نفس الحجم أو أصغر من حجم المرجع/المؤشر. ليس هناك ما يضمن أن برنامج التحويل البرمجي سيقوم بذلك ، لذلك إذا كان لديك خيار ، فقم بتمرير أنواع بدائية حسب القيمة. على الرغم من ذلك ، في الكود المقبل ، غالبًا ما يتعين عليك المرور بالرجوع إليه على أي حال - ضع في اعتبارك PUST_BACK الخاص بـ Vector والذي يأخذ مرجعًا const. إذا كان لديك ناقل من ints ، فستمرر مرجعًا إلى نوع بدائي. في هذه الحالة ، تأمل أن يقوم المترجم بتحسين ذلك عن طريق استبدال المرجع بقيمة. نظرًا لأن المتجه يمكن أن يقوم بتخزين أنواع كبيرة على الرغم من أن قبول مرجع Const هو الخيار الأفضل.