سؤال

أتفهم أنه يمكنك استخدام الكلمة الأساسية المضمنة أو مجرد وضع طريقة في إعلان فئة مثل ctor أو طريقة getter، ولكن هل يتخذ المترجم القرار النهائي بشأن متى يتم تضمين أساليبي؟

على سبيل المثال:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

هل سيتجاهل المترجم إعلاني المضمن إذا كان يعتقد أنه سيجعل الكود الخاص بي غير فعال؟

كمشكلة جانبية، إذا كان لدي طريقة getter تم الإعلان عنها خارج صفي مثل هذا:

void Foo::bar() { std::cout << "baz"; }

هل سيقوم المترجم بتضمين هذا تحت الأغطية؟

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

المحلول

وإذا كان أو لم يكن fiunction وinlined هو، في نهاية المطاف، تماما حتى المترجم. عادة، وظيفة أكثر تعقيدا هي من حيث تدفق، وأقل احتمالا المترجم هو مضمنة ذلك. وبعض الوظائف، مثل تلك التي متكررة، ببساطة لا يمكن inlined.

والسبب الرئيسي لعدم رمز مصدر وظيفة هو أنه من شأنه أن يزيد كثيرا من الحجم الكلي للقانون، ومنع IOT من محتجزين في ذاكرة التخزين المؤقت المعالج. وهذا من شأنه في الواقع أن يكون pessimisation، بدلا من أن تكون الأمثل.

وأما بالنسبة لترك مبرمج تقرر يطلق النار على نفسه في القدم، أو في أي مكان آخر، يمكنك مضمنة وظيفة نفسك - كتابة التعليمات البرمجية التي قد ذهب في وظيفة في ما يمكن أن يكون الموقع دعوة الدالة

نصائح أخرى

نعم، القرار النهائي بشأن تضمين التعليمات البرمجية الخاصة بك أم لا يكمن في مترجم C++.الكلمة الأساسية المضمنة هي اقتراح وليست مطلبًا.

فيما يلي بعض التفاصيل حول كيفية معالجة هذا القرار في مترجم Microsoft C++

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

وكما ذكر آخرون، والكلمة inline هو مجرد اقتراح للمترجم إلى مضمنة التعليمات البرمجية. وبما أن التعليمات البرمجية المضمنة بشكل روتيني التي لم يتم وضع علامة مترجم مع inline، وليس التعليمات البرمجية المضمنة التي لديها، والكلمة يبدو مجرد زائدة كما register أو (ما قبل-C ++ 0X) auto.

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

نعم، المترجم لديه القرار النهائي. في VS، يمكنك أيضًا تضمين الوظائف العودية في عمق محدد ;)

#pragma inline_depth( [0... 255] )

وفقط لإضافة بلدي 5 سنتات ...

ولقد وجدت هذا جورو من أسبوع مقالة حول رمز مصدر مفيد للغاية.

وبقدر ما أتذكر أنني قرأت في مكان ما أنه حتى رابط قد تفعل رمز مصدر، عندما يربط الملفات الكائن ويرى أن رمز يتم ربط يمكن inlined.

والتحيات،
Ovanes

<اقتباس فقرة>   

وأما قضية جانبية، إذا كان لدي أعلن طريقة جالبة خارج صفي مثل هذا:

void Foo::bar() { std::cout << "baz"; }
<اقتباس فقرة>   

هل المترجم مضمنة هذا تحت الأغطية؟

وهذا يعتمد. ويمكن لجميع المتصلين في وحدة الترجمة نفسها (ملف .cpp وجميع تعاريفه #included). لكنها ما زالت تحتاج الى تجميع نسخة غير inlined لأنه قد يكون هناك المتصلين من أن وظيفة خارج وحدة الترجمة. يمكنك يحتمل أن نرى في هذا العمل (إذا كان المترجم الخاص بك في الواقع يمكن أن يفعل ذلك) عند مستويات الأمثل عالية. (وعلى وجه الخصوص:. المقارنة بين ما يحدث عندما # تضمين جميع الملفات .CPP الخاص في .CPP واحد مقابل تخطيط نموذجي مع جميع التعاريف في وحدة الترجمة واحدة من الفرص لهذه الزيادة رمز مصدر كبير)

وحسب معرفتي، فإن المترجم تلقائيا جعل وظيفة لك أعلن مضمنة (أو كتب داخل تعريف فئة) غير -inline إذا وجد حلقة مثل ل، في حين الخ هذا مثال واحد حيث مترجم لديه القول الفصل في وظائف مضمنة.

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

وهذا هو السبب في "مضمنة" الكلمة (وحتى في بعض الحالات، والمتغيرات القسري) يمكن أن تحمل ليست لديها وسيلة معيارية للاضطرها - يمكنك دائما مجرد كتابة ماكرو

.

وقال أن الكلمة مضمنة في كثير من الأحيان أفضل، لأن المترجم في كثير من الأحيان يعرف ما إذا كان اتخاذ مضمنة ظيفة منطقي أم لا، وذلك لأن المضمنة يمكن أن تتفاعل مع بقية أمثل مترجم.

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