سؤال

إذا كانت لدي دالة تُرجع كائنًا، لكن قيمة الإرجاع هذه لا يستخدمها المتصل مطلقًا، فهل سيقوم المترجم بتحسين النسخة؟(ربما تكون الإجابة دائمًا/أحيانًا/لا تجيب أبدًا).

مثال ابتدائي:

ReturnValue MyClass::FunctionThatAltersMembersAndNeverFails()
{
    //Do stuff to members of MyClass that never fails
    return successfulResultObject;
}

void MyClass::DoWork()
{
    // Do some stuff
    FunctionThatAltersMembersAndNeverFails();
    // Do more stuff
}

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

يحرر:دعونا نبسط هذا قليلًا، لأنه لا يبدو أن هناك إجماعًا في الحالة العامة.ماذا إذا ReturnValue هو int، ونعيد 0 بدلاً من ذلك successfulResultObject?

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

المحلول

إذا الطبقة ReturnValue لديها نسخة منشئ غير تافهة، المترجم يجب أن لا يلغي الدعوة إلى منشئ نسخة - كلف من قبل اللغة التي يتم استدعائها

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

نصائح أخرى

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

ورابط يمكن أن تأخذ الرعاية من هذا النوع من الشيء، حتى لو كان المتصل الأصلي ودعا هي في وحدات تجميع مختلفة.

إذا كان لديك سبب وجيه للقلق بشأن الحمل CPU مخصصة لاستدعاء أسلوب (التحسين من السابق لأوانه هو أصل كل الشرور،) قد نظر في العديد من الخيارات رمز مصدر المتاحة لك، بما في ذلك (في اللحظات!) ماكرو .

هل تحتاج حقا لتحسين على هذا الصعيد؟

إذا قيمة الإرجاع هي عدد صحيح وتعود 0 (كما هو الحال في مسألة محررة)، ثم وهذا قد الحصول الأمثل بعيدا.

وعليك أن تبحث في الجمعية الأساسي. إذا لم يتم inlined وظيفة ثم فإن التجمع الأساسي بإعدام EAX وسائل التحقق، 0 (أو EAX XOR، EAX) لتعيين EAX (الذي يستخدم عادة لقيم الأعداد العودة) إلى 0. إذا تم inlined وظيفة، وهذا بالتأكيد سوف تحصل الأمثل بعيدا.

ولكن هذا senario ليس من المفيد جدا إذا كنت قلقا حول ما يحدث عند العودة أشياء أكبر من 32 بت. سوف تحتاج إلى الرجوع إلى الإجابة على السؤال unedit، والتي ترسم صورة جيدة: إذا تم inlined كل شيء ثم سيتم تحسين أكثر من ذلك. إذا لم يتم inlined ذلك، ثم يجب استدعاء وظائف حتى لو لم يكن حقا أن تفعل أي شيء، وهذا يشمل منشئ كائن (منذ المترجم لا يعرف ما إذا كان منشئ تعديل المتغيرات العالمية أو فعل شيء آخر غريب) .

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

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

وأما البعض الآخر يلاحظ هذه ليست مسألة تافهة على مستوى AST إعادة كتابة.


تعمل

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

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