سؤال

أرغب في التأكد من أنني أفهم مرجعًا بالمرور بشكل صحيح. على وجه الخصوص ، أنا أبحث في إصدارات البادئة/postfix من الزيادة ++ مشغل لكائن.

لنفترض أن لدينا الفصل التالي X:

class X{
private:
    int i;
public:
 X(){i=0;}
 X& operator ++ (){ ++i; return *this; } //prefix increment

 X operator ++ (int unused){ //postfix increment
  X ret(*this);
  i++;
  return ret;
 }

 operator int(){ return i; } //int cast
};

بادئ ذي بدء ، هل قمت بتطبيق مشغلي زيادة بادئة/postfix بشكل صحيح؟

ثانياً ، ما مدى كفاءة ذاكرة مشغل PostFix ، مقارنة بمشغل البادئة؟ على وجه التحديد كم عدد X يتم إنشاء نسخ الكائن عند استخدام كل إصدار من المشغل؟

قد يساعدني شرح لما يحدث بالضبط مع عودة الإرجاع مقابل القيمة المرجعية.


تحرير: على سبيل المثال ، مع الكود التالي ...

X a;
X b=a++;

... هل A و B الآن الأسماء المستعارة؟

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

المحلول

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

مع مرجع عودة على حدة ، تقوم بإرجاع إشارة L-Value إلى الكائن الحالي. عادةً ما يقوم المترجم بتنفيذ هذا عن طريق إرجاع عنوان الكائن الحالي. هذا يعني أن إرجاع الكائن بسيط مثل إرجاع الرقم.

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

تبدو كفاءة التنفيذ الخاصة بك على المستوى مع التطبيقات النموذجية.

تحرير: فيما يتعلق بإضافتك ، لا ، فهي ليست أسماء مستعارة. لقد قمت بإنشاء كائنين منفصلين. عند العودة حسب القيمة (وعندما تنشئ كائنًا جديدًا من داخل مشغل زيادة Postfix) ، يتم وضع هذا الكائن الجديد في موقع ذاكرة متميز.

ومع ذلك ، في الكود التالي ، A و B نكون اسماء مستعارة:

 int a = 0;
 int& b = ++a;

B هو عنوان يشير إلى.

نصائح أخرى

من الاصطناعي أكثر من ذلك من الكائن نفسه في زيادة postfix:

X operator++(int)
{
    X copy(*this);
    ++*this;         // call the prefix increment
    return copy;
}

منطق زيادة X وبالتالي فإن الكائن موجود فقط داخل إصدار البادئة.

يتم تنفيذ المشغلين بشكل صحيح.

في مشغل البادئة ، لم يتم إجراء أي نسخ من x.

في مشغل postfix ، يتم صنع نسخة واحدة لـ RET ، و يحتمل يتم إجراء نسخة أخرى عند العودة من الوظيفة ، ولكن جميع المترجمين سوف يرفعون هذه النسخة.

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