هل هناك أي ميزة في استخدام الوسيطة المرجعية في هذه الوظيفة؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

لقد حددت الطبقة التالية:

class Action
{
    public: 
    Action(){ _bAllDone = false; }

    void AddMove( Move & m );
    private:
        std::deque<Move> _todo;
        bool _bAllDone;
};

يتم تعريف العضو AddMove على النحو التالي:

void Action::AddMove( Move & m )
{ 
    _todo.push_back( m ); 
}

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

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

المحلول

من المفترض أن تحافظ فئة Deeque في STL على نسخة من العنصر الذي تقوم به إلى طريقة الدفع الخاصة به. هذا هو المكان الذي يأتي فيه منشئ نسخة واحدة.

إذا تخلصت من المرجع في AddMove ()، فستحصل أولا على نسخة من المعلمة (وبالتالي استدعاء واحد من منشئ النسخ)، ثم عند الرجوع إلى الوراء، ستحصل على نسخة ثانية.

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

نصائح أخرى

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

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

هو - هي يجب يكون مرجعا، وإلا فسوف تكبد نسخة غير ضرورية (ويحتمل أن تكون غير صحيحة) من الوسيطة. يجب أن يكون أيضا const, وإلا فسوف تقيد غير ضرورية المتصلين.

ملاحظة أيضا أن الأسماء ذات السفل السفلية الرائدة محجوزة لتنفيذ اللغة، لذلك برنامجك حقيقي "غير محدد".

هذر

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