سؤال

أرغب في التأكد من أن إجراءاتي الروتينية تستفيد من (N)RVO كلما أمكن ذلك.بخلاف التحليل من خلال التفكيك الناتج، هل هناك شيء يمكنني القيام به أو التحقق منه لمعرفة ما إذا كان يتم تجميع الروتين باستخدام (N)RVO؟في هذه المرحلة أنا مهتم في الغالب بـ MSVC وGCC.

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

المحلول

لا ليس بالفعل كذلك.

ومع ذلك، يمكنك اتباع الإرشادات عند كتابة التعليمات البرمجية الخاصة بك.


تحسين قيمة الإرجاع غير المسماة

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

return MyObject(....);

تحسين قيمة الإرجاع المسماة

يتم تشغيل هذا إلى حد كبير في كل مرة تقوم فيها الوظيفة دائمًا بإرجاع نفس الكائن المؤقت:

MyObject func() {
  MyObject result;
  if (...) { return result; }

  result.push(0);
  return result;
}

يمكنك مزج هذه العناصر، لكن يصبح من المستحيل على المترجم تطبيق RVO في هذه الحالة:

MyObject func() {
  MyObject result;
  if (...) { return MyObject(...); }

  return result;
}

هنا، من المحتمل أن يستفيد أحد العائدين من RVO والآخر لن يستفيد.وأراهن على أن الأول قد تم تحسينه لأنك ستكون عالقًا إذا قمت بإنشائه بشكل تخميني result في فتحة العودة وتحتاج فجأة إلى اتخاذ if فرع.لاحظ أن إعادة ترتيب العبارات ببساطة تعمل فقط:

MyObject func() {
  if (...) { return MyObject(...); }

  MyObject result;

  return result;
}

لذا فإن القاعدة الأساسية لـ NRVO هي أنه لا ينبغي أن يكون هناك أي شيء return بيان بين إعلان result و ال return result; البيان الذي يعود بأي شيء آخر غير result بحد ذاتها.


إذا اتبعت هذا، فإنك تكدس الاحتمالات لصالحك.وبعد ذلك يتعلق الأمر بمراجعة التعليمات البرمجية فقط.

كما يمكنك أيضًا تسهيل قراءة التعليمات البرمجية الخاصة بك نظرًا لأنك لا تعلن عن المتغيرات قبل أن تعرف أنك بحاجة إليها حقًا!

نصائح أخرى

يمكنك إضافة أساليب تصحيح إلى المدمر: giveacodicetagpre.

إذا تم استدعاء المدمرة، ربما لم يتم تطبيق RVO.

الطرق المحتملة التي يمكنني التفكير بها هي:

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

  2. يمكنك ببساطة وضع آثار تصحيح الأخطاء في مُنشئ النسخ والمدمر لفصلك، إذا لم يحدث حذف النسخ، فسترى الكثير من آثار تصحيح أخطاء مُنشئ النسخ والمدمر المتعاقبة.

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