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

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

class some_class{};

some_class some_function()
{
    return some_class();
}

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

0
وأضاف تحرير
الآراء: 1

6 إجابة

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

فمثلا:

A a;
a = fn();

و

A a = fn();

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

In the first case the default constructor is called, وthen the assignment operator is invoked on a which requires a temporary variable to be constructed.

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

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, وto do that it has to have another instance.

0
وأضاف
المعيار بشكل صريح يسمح المحول البرمجي elide منشئ نسخة.
وأضاف المؤلف Daniel James, مصدر

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

0
وأضاف
في الواقع ، غالبًا ما يكون المجمعون الحديثون قادرين على إبعاد المتغير المحدد الذي يتم إعادته
وأضاف المؤلف Nemanja Trifunovic, مصدر

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

0
وأضاف
إنه مجرد أنني لم أشاهده في أي مكان في تجربتي المحدودة مع C ++.
وأضاف المؤلف Jason Baker, مصدر
عادل بما يكفي. بالتأكيد استخدمها ، إذا لم يكن هناك أي سبب لاستخدام متغير مؤقت فلا داعي لذلك!
وأضاف المؤلف Greg Hewgill, مصدر

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

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

0
وأضاف
عموما ، RVO أكثر كفاءة من استخدام shared_ptr ، يتم إنشاء الكائن في مكانه على كومة الذاكرة المؤقتة. يجب أيضًا على shared_ptr إنشاء كائن إضافي لتخزين العدد في.
وأضاف المؤلف Daniel James, مصدر

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

0
وأضاف

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

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

0
وأضاف