الثقة في تحسين قيمة الإرجاع
-
22-09-2019 - |
سؤال
كيف تسير في استخدام تحسين قيمة الإرجاع?
هل هناك أي حالات يمكنني من خلالها الوثوق بمترجم حديث لاستخدام التحسين ، أو هل يجب أن أذهب دائمًا إلى الطريقة الآمنة وإرجاع مؤشر من نوع/استخدام مرجع كمعلمة؟
هل هناك أي حالات معروفة حيث لا يمكن إجراء تحسين قيمة الإرجاع؟ ، يبدو لي أن تحسين قيمة الإرجاع سيكون سهلاً إلى حد ما على المترجم.
المحلول
كلما تم تمكين تحسينات البروتشر (وفي معظم المجمعين ، حتى عندما تكون التحسينات معاق) ، سوف RVO. يعد NRVO أقل شيوعًا قليلاً ، لكن معظم المترجمين سيؤدون هذا التحسين أيضًا ، على الأقل عند تمكين التحسينات.
أنت على حق ، التحسين هو من السهل إلى حد ما أن يقوم المترجم ، وهذا هو السبب في أن المترجمين يقومون بذلك دائمًا. الحالات الوحيدة التي "لا يمكن صنعها" هي الحالات التي لا ينطبق فيها التحسين: ينطبق RVO فقط عند إرجاع مؤقت لم يكشف عن اسمه. إذا كنت ترغب في إرجاع متغير محلي مسمى ، فإن NRVO يطبق بدلاً من ذلك ، وبينما يكون أكثر تعقيدًا قليلاً لتنفيذ برنامج التحويل البرمجي ، فإنه يمكن القيام به ، وليس لدى المترجمين الحديثين أي مشكلة.
نصائح أخرى
للحصول على أفضل فرصة حدوث ذلك ، يمكنك إرجاع كائن تم إنشاؤه مباشرة في عبارة الإرجاع [هل يمكن لأي شخص أن يتذكر اسم هذا المصطلح - لقد نسيته]:
Foo f() {
....
return Foo( ... );
}
ولكن كما هو الحال مع جميع التحسينات ، يمكن للمترجم دائمًا اختيار عدم القيام بذلك. وفي نهاية اليوم ، إذا كنت بحاجة إلى إرجاع القيمة اليك ، فليس بديلًا للثقة في المترجم - المؤشرات والمراجع لن تقطعها.