سؤال

كيف تسير في استخدام تحسين قيمة الإرجاع?
هل هناك أي حالات يمكنني من خلالها الوثوق بمترجم حديث لاستخدام التحسين ، أو هل يجب أن أذهب دائمًا إلى الطريقة الآمنة وإرجاع مؤشر من نوع/استخدام مرجع كمعلمة؟

هل هناك أي حالات معروفة حيث لا يمكن إجراء تحسين قيمة الإرجاع؟ ، يبدو لي أن تحسين قيمة الإرجاع سيكون سهلاً إلى حد ما على المترجم.

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

المحلول

كلما تم تمكين تحسينات البروتشر (وفي معظم المجمعين ، حتى عندما تكون التحسينات معاق) ، سوف RVO. يعد NRVO أقل شيوعًا قليلاً ، لكن معظم المترجمين سيؤدون هذا التحسين أيضًا ، على الأقل عند تمكين التحسينات.

أنت على حق ، التحسين هو من السهل إلى حد ما أن يقوم المترجم ، وهذا هو السبب في أن المترجمين يقومون بذلك دائمًا. الحالات الوحيدة التي "لا يمكن صنعها" هي الحالات التي لا ينطبق فيها التحسين: ينطبق RVO فقط عند إرجاع مؤقت لم يكشف عن اسمه. إذا كنت ترغب في إرجاع متغير محلي مسمى ، فإن NRVO يطبق بدلاً من ذلك ، وبينما يكون أكثر تعقيدًا قليلاً لتنفيذ برنامج التحويل البرمجي ، فإنه يمكن القيام به ، وليس لدى المترجمين الحديثين أي مشكلة.

نصائح أخرى

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

Foo f() {
    ....
    return Foo( ... );
}

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

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