الدوال المدمجة في ++C

الدوال المدمجة

قلنا أن أسلوب البرمجة بإستخدام الدوال يوفر من مساحة التخزين في الذاكرة , فالبديل هو أن تكرار أوامر الدالة كلما احتجنا إليها . والشكل التالي يبين الفرق بين نظام الدوال ونظام تكرار الأوامر لنفس الوظيفة .

Object-Oriented Programming in C   _Page_0222_Image_0001

شكل الدوال والأوامر المكررة

علي أن هذا الأسلوب يتسبب في إبطاء تنفيذ البرنامج , فكلما استدعيت الدالة الفرعية تطلب الأمر إيقاف التنفيذ الجاري للدالة المستدعية (يتم ذلك عمليا عن طريق الأمر CALL في محول صياغة الأسمبلي ) , وتحفظ كافة السجلات والمكادس ] أماكن معينة للتخزين سنعرض لها فيما بعد [ المتعلقة بالدالة المستدعية قبل الانتقال للدالة المستدعاة . وفد يكون من الأجدي أن تكرر أوامر الوظائف إذا كانت صغيرة العدد , فما تستهلكه من مساحة إضافية يبرره الإسراع في التنفيذ . علي أن ذلك يضعف من تنسيق البرنامج وهيكلة وظائفه .

وحلا لهذه الإشكالية , وضع نظام يمكن به وضع دالة ما , بحيث تترجم كأسطر مدمجة في صياغة الدالة الأصلية , ولكنها تظهر في البرمجة كدالة منفصلة . ويكون ذلك بإضافة الكلمة الحاكمة iniline قبل تعريف الدالة . ولكن هذه الإمكانية تتطلب أن يكون تعريف الدالة قبل الدالة التي سوف تستدعيها , حتي يتمكن محول الصياغة من إدماجها , وعلي ذلك فإن مكان سطر الإعلان عن النمط الأولي للدالة سوف يشغله التعريف بالدالة , ولن يكون هناك داع لتكرار التعريف مرة أخري . وإليك مثالا يطبق هذه الإمكانية , وهو تعديل للبرنامج convert2.cpp والذي يحول الأرطال إلي كيلو جرامات , وقد عرفت الدالة المسئولة عن التحويل ؛ ibstokg() علي أنها دالة مدمجة .

inline.cpp


 


// inline.cpp


// demonstrates inline functions


#include <iostream.h>


#include <conio.h>


 


// lbstokg()                        // definition of


// converts pounds to kilograms     // inline function


inline float lbstokg(float pounds)  // (must precede calls


   {                                // to it)


   return 0.453592 * pounds;


   }


 


void main()                         // main() must follow any


   {                                // inline definitions


   float lbs;


 


   cout << "\nEnter your weight in pounds: ";


   cin >> lbs;


   cout << "Your weight in kilograms is " << lbstokg(lbs);


   getche();


   }




ويجدر ملاحظة أن محول الصياغة قد يتجاهل الأمر online فلا يدمج الدالة . وذلك إذا ما قدر أن طولها أكبر من أن يصلح للإدماج .

تعليقات

المشاركات الشائعة من هذه المدونة

المؤثرات الحسابية في C++

دوال النمط الرسومي في ++C

المؤثرات المنطقية في C++