سؤال

هل من الممكن أن يعود حاوية قياسية من وظيفة دون إجراء نسخة ؟

رمز المثال:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();

بقدر ما أفهم هذا نسخ قيمة الإرجاع إلى ناقلات جديدة ب.لا يجعل العمل عودة المراجع أو شيء من هذا القبيل تسمح تجنب نسخ ؟

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

المحلول

إذا كان المترجم الخاص بك يدعم NRVO ، فلن يتم إجراء أي نسخة ، شريطة استيفاء شروط معينة في الوظيفة التي تعيد الكائن. لحسن الحظ ، تمت إضافة هذا أخيرًا في Visual C ++ 2005 (V8.0) يمكن أن يكون لهذا تأثير كبير +ve على perf إذا كانت الحاوية كبيرة ، من الواضح.

إذا لم تحدد مستندات المترجم الخاصة بك ما إذا كان مدعومًا أم لا ، فيجب أن تكون قادرًا على تجميع رمز C ++ إلى Assembler (في وضع الأمثل/الإصدار) والتحقق من ما يتم باستخدام وظيفة عينة بسيطة.

هناك أيضًا مناقشة أوسع ممتازة هنا

نصائح أخرى

Rvalues ("المؤقتات") لا بد أن const المراجع لديهم حياتهم تمتد إلى نهاية المرجعية عمر.حتى إذا كنت لا تحتاج إلى تعديل هذا ناقلات التالية سوف تفعل:

const std::vector<A>& b = MyFunc();

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

وإلا تعتمد على C++1x مع rvalue المراجع الخطوة دلالات القادمة جنبا إلى جنب "قريبا جدا الآن" وتحسين تلك النسخة من دون الحاجة إلى القيام بأي شيء.

إذا كنت تستطيع تعديل توقيع الوظيفة ، فيمكنك استخدامها

std::vector<A>& MyFunc(); 

أو

void MyFunc(std::vector<A>& vect);

يمكنك أيضًا إرجاع مؤشر ذكي ، لكن هذا يتضمن تحديد الكائن.

some_smart_pointer<std::vector<A>> MyFunc();

HTH

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