سؤال

هل يقوم المترجم بتحسين أي مضاعفات بـ 1؟أي خذ بعين الاعتبار:

int a = 1;
int b = 5 * a;

هل سيتم تحسين التعبير 5 * a إلى 5 فقط؟إذا لم يكن الأمر كذلك، فهل سيتم تعريفه على النحو التالي:

const int a = 1;
هل كانت مفيدة؟

المحلول

سيقوم بحساب أي تعبيرات ثابتة مسبقًا عند تجميعها، بما في ذلك تسلسل السلسلة.بدون ال const سيتم تركها وحدها.

يتم تجميع المثال الأول الخاص بك إلى IL هذا:

.maxstack 2
.locals init ([0] int32, [1] int32)

ldc.i4.1   //load 1
stloc.0    //store in 1st local variable
ldc.i4.5   //load 5
ldloc.0    //load 1st variable
mul        // 1 * 5
stloc.1    // store in 2nd local variable 

المثال الثاني يجمع على هذا:

.maxstack 1
.locals init ( [0] int32 )

ldc.i4.5 //load 5 
stloc.0  //store in local variable

نصائح أخرى

وانتشار مستمر هي واحدة من الأكثر شيوعا والأسهل تحقيق أمثلية.

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

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

ما سيقوم المترجم بتحسينه هنا ليس الضرب في 1 في حد ذاته، بل حسابيًا بقيم معروفة في وقت الترجمة.لذا، نعم، سيقوم المترجم بتحسين جميع العمليات الحسابية في مثالك، مع أو بدون const.

يحرر: أ كفؤ المترجم، أود أن أقول.

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