هل هناك أي خطأ في إرجاع القيم الافتراضية المبنية؟

StackOverflow https://stackoverflow.com/questions/96500

سؤال

لنفترض أن لدي الكود التالي:

class some_class{};

some_class some_function()
{
    return some_class();
}

يبدو أن هذا يعمل بشكل جيد ويوفر لي مشكلة الاضطرار إلى الإعلان عن متغير فقط لعمل قيمة إرجاع.لكنني لا أعتقد أنني رأيت هذا من قبل في أي نوع من البرامج التعليمية أو المرجعية.هل هذا شيء خاص بالمترجم (visual C++)؟أم أن هذا يفعل شيئا خاطئا؟

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

المحلول

لا هذا صحيح تماما.سيكون هذا أيضًا أكثر كفاءة حيث أن المترجم قادر فعليًا على تحسين التخلص من المؤقت.

نصائح أخرى

إن إرجاع الكائنات من استدعاء دالة هو نمط تصميم "المصنع"، ويستخدم على نطاق واسع.

ومع ذلك، ستحتاج إلى توخي الحذر سواء قمت بإرجاع كائنات أو مؤشرات إلى كائنات.سيقدم لك الأول منهم نسخ المنشئين/مشغلي المهام، الأمر الذي قد يكون مؤلمًا.

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

على سبيل المثال:

A a;
a = fn();

و

A a = fn();

ليسوا متشابهين.

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

في الحالة الثانية يتم استخدام منشئ النسخ.

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

الفرق بين مثال Rob Walker يسمى تحسين قيمة الإرجاع (RVO) إذا كنت تريد البحث عنه في Google.

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

هذا معقول تمامًا C++.

يعد هذا أمرًا قانونيًا تمامًا لـ C++ ويجب على أي مترجم قبوله.ما الذي يجعلك تعتقد أنه ربما يفعل شيئًا خاطئًا؟

هذه هي أفضل طريقة للقيام بذلك إذا كان فصلك خفيف الوزن جدًا - أعني أن إنشاء نسخة منه ليس مكلفًا للغاية.

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

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

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

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