سؤال

لدي وظيفة تبدو هكذا:

// Fetch 1 MB of data
void GetData(std::vector<char> & outData);

تم المبالغة في 1MB ، لكنني أريد فقط أن أثير النقطة التي من الأفضل تجنب نسخ غير ضرورية.

إذا أضفت هذا الحمل الزائد:

std::vector<char> GetData()
{
    std::vector<char> result;
    GetData(result);
    return result;
}

ثم ما مدى احتمال بدء RVO؟

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

المحلول

مع معظم المترجمين الحديثة بشكل معقول (على سبيل المثال ، VS 2005 أو أحدث ، GCC 3.4 أو الأحدث) ، فهذا مؤكد بشكل أساسي. أنا أقول فقط "أكثر" لأنني لم أختبر كل مترجم موجود. كل مترجم جديد نظرت إليه في السنوات الخمس الماضية أو نحو ذلك قد شمله.

نصائح أخرى

على الأرجح أن RVO ستركل ، لأنه تحسين بسيط للغاية ، والذي كان متاحًا لفترة طويلة. ومع ذلك ، من أجل إعطاء هذه القطعة من الكود القيمة العملية الحقيقية حتى في التعليمات البرمجية عالية الأداء المعتدلة التي تحتاجها NRVO. من الصعب العثور على NRVO ، لأنه جديد نسبيًا. ومع ذلك فهي متوفرة. برنامج التحويل البرمجي MS ، على سبيل المثال ، ينفذه منذ VS2005.

لا أعتقد أن هناك أي إجابة قياسية على هذا: يعتمد الأمر على المترجم الخاص بك وما هو قادر عليه.

إذا كنت تفكر في تنفيذ هذا للراحة ، فلماذا لا تحاول فقط على المترجم (المترجمات) الخاصة بك وإما أن تنظر إلى التجميع أو الملف الشخصي ومعرفة ما يحدث؟ من المحتمل أن تكون الأدلة التجريبية حول ما يفعله المترجم الخاص بك أفضل من تخمين ما قد يفعله أو لا يفعل بعض المترجمين.

ثم ما مدى احتمال بدء RVO؟

إنها وظيفة مطور البرمجيات للتفكير ، وليس المترجم.

يتم تحسين المترجمين بشكل عام لجعل الكود الجيد يعمل بشكل جيد - وليس الرمز السيئ.

أنا شخصياً أستخدم النموذج الأول. عادة مع مؤشر بدلاً من المرجع - لتسليط الضوء على حقيقة أن المعلمة هي الإخراج ، وليس الإدخال.

لاحظ أيضًا أنه عندما تقول:

std::vector<char> GetData() 
{ 
//   :
    return result; 
}

vector<char> x = GetData();

في كالي ، result يتم نسخه إلى "قيمة الإرجاع" ، ثم في المتصل ، يتم نسخ "قيمة الإرجاع" إلى x. يمكن لـ NRVO التخلص من إحدى تلك النسخ ، ولكن ليس كلاهما. يلزم المترجم بالاتصال بالنسخ CTOR مرة واحدة على الأقل ، لأنه يجب أن يفترض أن النسخة CTOR لها آثار جانبية يجب القيام بها.

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