سؤال

أنا مرتبك بشأن كيفية القيام بوظائف مضمّنة في C ++ ....

دعنا نقول هذه الوظيفة. كيف يمكن تحويلها إلى وظيفة مضمنة

int maximum( int x, int y, int z )
{
   int max = x;
   if ( y > max )
      max = y;
   if ( z > max )
      max = z;
   return max;
}   
هل كانت مفيدة؟

المحلول

كما قال آخرون ، يمكنك استخدام inline الكلمة الرئيسية لإخبار المترجم الذي تريده وظيفتك. لكن ال inline الكلمة الرئيسية هي مجرد برنامج التحويل البرمجي ملحوظة. يمكن للمترجم وسوف يختار تجاهل طلبك إذا كان يريد أو يحتاج إلى ذلك.

البديل هو جعل وظيفتك قالب وظائف ، والذي غالباً ما يتم تفجيره ضمنًا:

template<class Val>
Val maximum( Val x, Val y, Val z )
{
   Val max = x;
   if ( y > max )
      max = y;
   if ( z > max )
      max = z;
   return max;
}   

نصائح أخرى

من أجل تحويلها إلى وظيفة مضمنة ، تحتاج إلى القيام بأمرين:

  1. أعلن أنه مضمّن باستخدام الكلمة الرئيسية inline.
  2. تأكد من أن تعريف من هذه الوظيفة مرئية في كل وحدة ترجمة حيث يتم استخدامها. هذا يعني عادة أنه يتعين عليك وضع التعريف الكامل للوظيفة في ملف رأس.

لنشر إجابة نيلز كإجابة حقيقية:

inline int maximum(int x, int y, int z)
....

إذا ظهر تعريف الوظيفة هذا داخل أ class {} التعريف ، ثم يكون مضمّنًا تلقائيًا بالفعل.

خلاف ذلك ، كما يقول الآخرون ، وضع inline امام.

لجعل الوظيفة مضمنة ، استخدم الكلمة الرئيسية المضمنة:

inline int maximum( int x, int y, int z ) // note the inline keyword
{
   int max = x;
   if ( y > max )
      max = y;
   if ( z > max )
      max = z;
   return max;
}

إذا كانت الوظيفة عضوًا في فئة/بنية ، فما عليك سوى تحديده داخل الفصل (كما هو موضح في الخارج) يجعله مضمراً.

قل أن لديك المكالمة:

int f = maximum(3, 4, 5)

قد يوسع المترجم الدعوة إلى شيء مثل:

int max = x;
if ( y > max )
   max = y;
if ( z > max )
   max = z;
int z = max;

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

يمكنك قراءة المزيد حول الوظائف المضمنة وكيف (ومتى) لاستخدامها في C ++ الأسئلة الشائعة لايت وهذا غوتو

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

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