سؤال

دعنا نقول أن لدي وظيفة:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

هل يقول C ++ 0x على وجه التحديد أن النسخة الزائفة سيتم تجنبها من قيمة الإرجاع من Randomvector؟ أو هل يحتاج مترجم إلى تنفيذ RVO؟ يبدو لي مثل القيمة randomVector() يجب أن يعامل ككملاء، وبالتالي يجب استدعاء منشئ خطوة V، لكنني لست متأكدا تماما هذا صحيح.

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

المحلول

القاعدة هي التالية

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

مثلك تقول، المؤقتة هو RValue، وبالتالي يتم تحديد منشئ التحرك، بسبب قاعدة في 13.3.3.2/3, التي تقول أن مرجعي RValue يرتبط إلى RVALUE أفضل من مرجع Lvalue. في تحديد ما إذا كنت تريد استخدام هذه الخطوة أو منشئ النسخ، فإن دقة التحميل الزائد سيكون هناك تفضل بنقل منشئ.

القاعدة التي يسمح لها بالمترجم بأداء RVO 12.8/15.

نصائح أخرى

جميع قيم الإرجاع تعتبر rvalues لذلك إذا لم ينفذ المحول البرمجي RVO في هذه الحالة، فيجب عليك استخدام منشئ التحرك بدلا من منشئ النسخ.

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