ما هو أفضل توقيع طاقتها العوامل الحسابية في C++?

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

  •  02-07-2019
  •  | 
  •  

سؤال

كان من المفترض أن الكنسي شكل المشغل+ ، على افتراض وجود طاقتها المشغل+= وظيفة عضو كان يبدو مثل هذا:

const T operator+(const T& lhs, const T& rhs)
{
    return T(lhs) +=rhs;
}

ولكن أشير إلى أن هذا من شأنه أن تعمل أيضا:

const T operator+ (T lhs, const T& rhs)
{
    return lhs+=rhs;
}

في جوهر هذا النموذج التحويلات إنشاء مؤقتة من الجسم من تنفيذ استدعاء دالة.

يبدو محرجا قليلا إلى أنواع مختلفة لاثنين من المعلمات ، ولكن هل هناك أي شيء خاطئ مع الثاني ؟ هل هناك سبب أن تفضل واحدة على الأخرى ؟

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

المحلول

مع تحريرها السؤال النموذج الأول سيكون من المفضل.المترجم أكثر من المرجح أن تحسين قيمة الإرجاع (يمكن التحقق من ذلك عن طريق وضع نقطة توقف في منشئ T).النموذج الأول أيضا يأخذ كل المعلمات كما const, التي من شأنها أن تكون أكثر من المرغوب فيه.

البحث عن موضوع إرجاع القيمة الأمثل, مثل هذا الرابط سريعة على سبيل المثال: http://www.cs.cmu.edu/~gilpin/c++/performance.html

نصائح أخرى

أنا لست متأكدا مما إذا كان هناك فرق كبير في التعليمات البرمجية التي تم إنشاؤها إما.

بين هذين ، أنا (شخصيا) تفضل النموذج الأول لأنه أفضل ينقل النية.هذا هو على حد سواء فيما يتعلق بك إعادة استخدام += مشغل لغة يمر templatized أنواع من قبل const&.

وأود أن تفضل النموذج الأول لهذين.

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

const T operator+(const T& lhs, const T& rhs)
{
    return T(lhs)+=rhs;
}

لماذا لا هذا إذا كنت تريد terseness?

فكرتي الأولى هي أن النسخة الثانية قد تكون infinitessimally أسرع من الأول, لأنه لا يوجد مرجع يتم الضغط على المكدس كحجة.بيد أن هذا سيكون جدا مترجم-معال ، ويعتمد على سبيل المثال ما إذا كان المترجم يقوم اسمه إرجاع القيمة الأمثل أم لا.

على أي حال, في حال وجود أي شك أبدا اختيار صغير جدا كسب الأداء التي قد لا توجد حتى و أنت أكثر من المحتمل أن لا حاجة -- اختر أوضح النسخة هي الأولى.

في الواقع, والثاني هو المفضل.كما جاء في c++ القياسية ،

3.7.2/2:التخزين التلقائي مدة

إذا كان اسمه التلقائي كائن له التهيئة أو المدمر مع الآثار الجانبية, فهو لا يجوز دمرت قبل نهاية لها كتلة ، ولا يجوز القضاء كما الأمثل حتى إذا كان يبدو أن غير المستخدمة ، إلا أنه كائن فئة أو نسخة يجوز القضاء المحددة في 12.8.

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

const T operator+(const T& lhs, const T& rhs)
{
    T temp(lhs);
    temp +=rhs;
    return temp;
}

أعتقد أنه إذا كنت inlined لهم على حد سواء (أنا منذ إنهم مجرد توجيه الوظائف ، ويفترض المشغل+= وظيفة() هو خارج الخط) ستحصل على قرب تمييزه رمز جيل.وقال الأول هو أكثر الكنسي.الإصدار الثاني دون داع "لطيف".

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