سؤال

ربما أطرح سؤالًا غبيًا ، لكنني نظرت إلى صفحة ويكيبيديا لـ RVO هنا ولم يستطع التوقف عن التساؤل عما إذا كان هذا السلوك خطأ. لقد جربته في الجهاز الخاص بي ويتم ركل RVO بالكامل على الرغم من مستوى التحسين. ماذا لو كان هناك شيء في الواقع كبير يحدث في مُنشئ؟ أعلم أنه لا ينبغي ، ولكن ماذا لو؟ لا أستطيع أن أفهم لماذا سيظل RVO يحدث عندما تكون هناك آثار جانبية في المنشئ.

تعديل: -fno-elide-constructors يبدو أن توقف RVO. ولكن يبقى السؤال.

EDIT2: في ملاحظة أكثر جدية ، كم من الناس يعرفون شيئًا كهذا؟ ربما يكون ذلك في المعيار ، لكنه لا يزال ميزة قبيحة حقًا كما أراها. على الأقل يجب على المجمعين تعطيله افتراضيًا وتقديم مفتاح للأشخاص الذين يعرفون ذلك. قون

تحرير 3: ما زلت أصر على أن هذا سيء حقًا. :). لا أعتقد أنني أعرف أي قيود لغة أخرى مثل هذا يسير مباشرة ضد بناء جملة اللغة. كل شيء آخر يرمي إما مخلفات البرمجيات أو أخطاء الرابط بشكل صحيح؟

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

المحلول

يوضح المعيار أن العمليات مع الاهتمام بالبرنامج حالة يمكن ملاحظتها يجب ألا يتم تحسينه بعيدًا ، باستثناء نسخ البناء في ظروف معينة. يجب ألا تعتمد على تنفيذ منشئي النسخ ، حتى لو كان لديهم آثار جانبية تتوقع رؤيتها (على سبيل المثال ، إخراج وحدة التحكم).

نصائح أخرى

كما قيل في الإجابات الأخرى ، يُسمح للمترجم بتحسين حتى مُنشئي النسخ غير التافهة ومشغلي المهام.

12.8.15

عند استيفاء معايير معينة ، يُسمح للتنفيذ بحذف نسخ إنشاء كائن فئة ، حتى لو كان لمؤسسة النسخ و/أو المدمرة للكائن آثار جانبية. في مثل هذه الحالات ، يعامل التنفيذ مصدر وهدف عملية النسخ المحذوفة كطريقتين مختلفتين للإشارة إلى نفس الكائن ، ويحدث تدمير هذا الكائن في وقت لاحق من الأوقات التي كان قد تم فيها تدمير الكائنين بدونها بدون التحسين. يُسمح بتشغيل عمليات النسخ هذه في الظروف التالية (والتي قد يتم دمجها للقضاء على نسخ متعددة):

-في عبارة إرجاع في دالة مع نوع إرجاع فئة ، عندما يكون التعبير اسم كائن أوتوماتيكي غير متطابق مع نفس النوع المؤهل CV كنوع إرجاع الوظيفة ، يمكن حذف عملية النسخ عن طريق بناء الأوتوماتيكي الكائن مباشرة في قيمة إرجاع الوظيفة

-عندما يتم نسخ كائن فئة مؤقتة لم يكن مرتبطًا بمرجع (12.2) ينسخ

حدد "خطأ". تسمح لغة C ++ صراحة بهذا النوع من التحسين على الرغم من أنه يمكن ملاحظته. إذا كان سلوك البرنامج الخاص بك يعتمد على تطبيق معين ، فأنت لسوء الحظ لا تستخدم ISO C ++ ، ولكن بعض لهجة.

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