سؤال

هل هناك حالة يكون فيها مرجع مرار على حدة أغلى من القيمة في C ++؟ إذا كان الأمر كذلك ، فماذا ستكون هذه الحالة؟

هل كانت مفيدة؟

المحلول

تفضل تمرير الأنواع البدائية (int ، char ، float ، ...) وهياكل جرابية رخيصة للنسخ (نقطة ، معقدة) بالقيمة.

سيكون هذا أكثر كفاءة من عدم التوجيه المطلوب عند المرور بالرجوع إليه.

نرى تعزيز سمات المكالمات.

فئة القالب call_traits<T> يتغلف طريقة "أفضل" لتمرير معلمة من نوع T من أو من أو من وظيفة ، وتتكون من مجموعة من typedefs المحددة كما في الجدول أدناه. الغرض من call_traits هو التأكد من عدم حدوث مشاكل مثل "الإشارات إلى المراجع" ، وأن المعلمات يتم تمريرها بالطريقة الأكثر كفاءة الممكنة.

نصائح أخرى

يمكنك قراءة هذه المقالة "تريد السرعة؟ تمرير بالقيمة" حول نسخ Elision و RVO (إرجاع عن طريق تحسين القيمة). ويوضح أن المراجع تمنع في بعض الأحيان المترجم من القيام به.

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

يمكن للمترجم تحسين تمرير نوع بدائي بالرجوع إلى مجرد المرور حسب القيمة ، إذا كان النوع هو نفس الحجم أو أصغر من حجم المرجع/المؤشر. ليس هناك ما يضمن أن برنامج التحويل البرمجي سيقوم بذلك ، لذلك إذا كان لديك خيار ، فقم بتمرير أنواع بدائية حسب القيمة. على الرغم من ذلك ، في الكود المقبل ، غالبًا ما يتعين عليك المرور بالرجوع إليه على أي حال - ضع في اعتبارك PUST_BACK الخاص بـ Vector والذي يأخذ مرجعًا const. إذا كان لديك ناقل من ints ، فستمرر مرجعًا إلى نوع بدائي. في هذه الحالة ، تأمل أن يقوم المترجم بتحسين ذلك عن طريق استبدال المرجع بقيمة. نظرًا لأن المتجه يمكن أن يقوم بتخزين أنواع كبيرة على الرغم من أن قبول مرجع Const هو الخيار الأفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top