الدوال المدمجة في ++C
الدوال المدمجة
قلنا أن أسلوب البرمجة بإستخدام الدوال يوفر من مساحة التخزين في الذاكرة , فالبديل هو أن تكرار أوامر الدالة كلما احتجنا إليها . والشكل التالي يبين الفرق بين نظام الدوال ونظام تكرار الأوامر لنفس الوظيفة .
شكل الدوال والأوامر المكررة
علي أن هذا الأسلوب يتسبب في إبطاء تنفيذ البرنامج , فكلما استدعيت الدالة الفرعية تطلب الأمر إيقاف التنفيذ الجاري للدالة المستدعية (يتم ذلك عمليا عن طريق الأمر 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 فلا يدمج الدالة . وذلك إذا ما قدر أن طولها أكبر من أن يصلح للإدماج .
تعليقات
إرسال تعليق