יום ראשון

Inline Functions

הנה פוסט קצר המציג סוג של פונקציה שאינה קיימת בשפת C.
מהי inline function? 
אתחיל בקיצור, ואח"כ הסבר מפורט למי שצריך: זוהי פונקציה שבמקום לבצע קפיצה אליה, הקומפיילר משכפל אותה בכל מקום שבו היא נקראת (inline), וכך חוסך את הקפיצה. (בשפת C מבצעים את זה בעזרת macro.)
הסבר מפורט:
נתחיל קודם בתאור פעולת הקריאה לפונקציה רגילה, כדי שנוכל להבין מה ה-inline חוסכת.
נסתכל על הדוגמא הבאה שמראה קריאה לפונקציה בשורות 3 ו-5:


  1. a = a+ 3;
  2. b = 7;
  3. compare(a,b);
  4. cout << "a = "<<a<<"b= " << b<<endl;
  5. a = 1;
  6. b = 6;
  7. compare(a,b);

void comapre(int a, int b){
..
..
..
}

התהליכים שיתבצעו בתוכנית הנ"ל:
- לאחר ביצוע הפקודה בשורה 2, a ו-b ידחפו למחסנית.
- הכתובת של שורה 4 נשמרת.
-  מצביע התוכנית קופץ לכתובת של compare.
- לאחר ש-compare תסתיים, הוא יקפוץ חזרה לשורה 4.

 התהליך יחזור על עצמו כשיגיע לשורה 7.
מכאן ברור שהקריאה לפונקציה כרוכה ב-overhead של מספר פעולות. ככל שהפונקציה הנקראת גדולה יותר, ה-overhead נעשה פחות משמעותי. ה-overhead משמעותי  יותר כשמדובר בפונקציות קטנות, בעיקר אם הן מופעלות בתדירות גבוהה.

פונקציות inline חוסכות את תהליך הקפיצה לפונקציה שתואר למעלה. במקום זה, הקומפיילר משכפל את הפונקציה בכל מקום שבו היא נקראת.
איך יוצרים פונקציית inline? פשוט כותבים inline בראש הפונקציה, כפי שמתואר כאן למטה (שורה 16).
הנה קטע התוכנית עם מימוש inline:

  1. /*
  2.  * inline.cpp
  3.  *
  4.  *  Created on: Mar 18, 2012
  5.  *      Author: ronen halevy
  6.  */
  7. #include <iostream>
  8. using namespace std;
  9. class Example{
  10. int a;
  11. int b;
  12. public:
  13. int find_max(int a, int b);
  14. };

  15. inline int Example::find_max(int a, int b){
  16. return(a > b ? a : b);
  17. }


  18. int main(){
  19. Example ex;
  20. int c = ex.find_max(2,3);
  21. cout << "Max is " << c << endl;
  22. c = ex.find_max(1,4);
  23. cout << "Max is " << c << endl;
  24. }

שורה 16: המתודה מוכרזת כ-inline.
שורות 23 ו-25: בשורות בהן נקראת הפונקציה תשתל הפונקציה עצמה.

הערות:
הפונקציה inline לא חייבת להכתב בשורה אחת. ברור שככל שהיא גדולה יותר הרווח היחסי שהיא מספקת קטן יותר והתשלום בגודל זכרון גדול יותר.

2 תגובות:

  1. יש אפשרות למנוע מהקומפיילר להגדיר אותה כאינליין?

    השבמחק
  2. Teton undertaker | TITAN TIGER - titanium undertaker
    Teton undertaker, profile picture, titanium undertaker shop and contact buy metal online information. winnerwell titanium stove Teton undertaker, profile picture. Teton titanium 3d printer undertaker, babyliss pro titanium flat iron profile picture. Teton undertaker, profile picture.

    השבמחק