سؤال

ما هو المضمنة؟

ما هو استخدامه ل؟

هل يمكنك تضمين شيء ما في C#؟

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

المحلول

ما هو عليه

في شروط C وC++، يمكنك استخدام الكلمة الأساسية المضمنة لإخبار المترجم باستدعاء روتين دون تحميل المعلمات على المكدس.بدلاً من ذلك، قامت الوظيفة بإدراج رمز الجهاز الخاص بها في الوظيفة التي تم استدعاؤها فيها.يمكن أن يؤدي هذا إلى زيادة ملحوظة في الأداء في بعض السيناريوهات.

المخاطر

تنخفض فوائد السرعة في استخدام "التضمين" بشكل ملحوظ مع زيادة حجم الدالة المضمنة.يمكن أن يؤدي الإفراط في الاستخدام في الواقع إلى تشغيل البرنامج بشكل أبطأ.عادةً ما يؤدي تضمين وظيفة ملحق صغيرة جدًا إلى تقليل حجم الكود بينما يمكن أن يؤدي تضمين وظيفة كبيرة جدًا إلى زيادة حجم الكود بشكل كبير.

التضمين في C#

في C#، يحدث التضمين على مستوى JIT حيث يتخذ مترجم JIT القرار.لا توجد حاليًا آلية في C# يمكنك من خلالها القيام بذلك بشكل صريح.إذا كنت ترغب في معرفة ما يفعله مترجم JIT، فيمكنك الاتصال بـ: System.Reflection.MethodBase.GetCurrentMethod().Name في وقت التشغيل.إذا كانت الطريقة مضمنة، فسوف تُرجع اسم المتصل بدلاً من ذلك.

في C# لا يمكنك فرض طريقة على التضمين ولكن يمكنك فرض طريقة على عدم القيام بذلك.إذا كنت تريد حقًا الوصول إلى مكدس استدعاءات محدد وتحتاج إلى إزالة التضمين، فيمكنك استخدام: MethodImplAttribute مع MethodImplOptions.NoInlining.بالإضافة إلى ذلك، إذا تم الإعلان عن طريقة ما على أنها افتراضية، فلن يتم تضمينها أيضًا بواسطة JIT.والسبب وراء ذلك هو أن الهدف النهائي للمكالمة غير معروف.

المزيد عن التضمين

نصائح أخرى

لتعريف ومناقشة رمز مصدر، نرى هذا السؤال .

في C # لا تحتاج إلى إرشاد المترجم أو وقت التشغيل إلى مضمنة لأن وقت التشغيل سوف نفعل ذلك تلقائيا.

وP.S. هذه الإجابة هي أيضا صحيحة للجافا.

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

وكما تستخدم تقنية الأمثل. في حالة C #، فإنه في الواقع يعتمد على محرك CLR JIT للقيام بهذا العمل. في وقت التشغيل، عند ترجمة الطريقة، فإن محرك JIT استخدام ارشادي لتحديد ما إذا كان مضمنة وظيفة مناسبة، وسوف يكون الأمثل effictive. إذا كان الأمر كذلك، يتم تنفيذ مضمنة.

وفانس لديه المادة كبيرة على ما يعتبره JIT عندما يؤدي تضمين: <لأ href = "http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to -inline التي هو بين و-question.aspx "يختلط =" نوفولو noreferrer "> http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to- مضمنة التي هو بين و-question.aspx

وليس هناك وسيلة لفرض مضمنة في C #. اللغة لا يدعم هذا البناء. أساسا لأن الناس القضاة سيئة للغاية ما ينبغي أن يكون الأمثل. وJITer قاض أفضل بكثير.

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