המונחים: Re-evaluating function Call Overhead

בתכנות C, כל שיחה מציגה מעל פני השטח: המדור חייב לדחוף טיעונים על הערימה (או להעביר אותם ברישום), לקפוץ לגוף הפונקציה, לבצע את הקוד, ולאחר מכן לחזור. עבור פונקציות קטנות, לעתים קרובות בשימוש, ראש זה יכול לשלוט זמן ביצוע, במיוחד בלולאות קריטיות ביצועים או פעולות מקונן עמוק.

מכניזם מאחורי פונקציות Inline

(הופנה מהדף [[המאה ה-1]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]] ו[[1924]], [[1924]], [[1924]], [[1924]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]], [[1924]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]], [[1924]], [[1924]], [[1924]]]], [[[[1924]]]]]], [[1966]]]]]], [[1924]]]]]]]]]]]]]]]], [[[[1924]]]]]]]], [[[[1924]]]]]]]], [[[[1924]]]]]], [[[[1966]], [[

  • (FLT:0) סטטית Inlineue: 1 הפונקציה יש קישור פנימי; כל יחידה תרגום מקבל עותק משלה.זוהי הגישה הבטוחה והניידת ביותר עבור פונקציות עוזרות קטנות המוגדרות בראש.
  • (ב) ב-C99):0.10.10.10.ההגדרה הפנימית מספקת לגוף לחדירה, אך הגדרה חיצונית חייבת להתקיים בנפרד (בדרך כלל בתיק אחד).
  • (ב) (ב-C99:0) ללא סטטי או מעצור: ב- C99, זה דומה לקו הפנימי החיצוני; ב- C11 נדרשות הגדרות חיצוניות רק אם הפונקציה אינה תואמת.

(FLT:0Key תובנה: ibFLT:1 ; inlining הוא לא ארוחת צהריים חינם.הפידר מנתח את עלות-תועלת סחר-off: הוספת גוף של פונקציה בכל אתר שיחה מגדיל את גודל הקוד (קודמת קוד), אשר יכול להפחית יעילות שרוול הוראה.

כאשר Inline Functions Excel: השתמש במקרים ובפרקטיקה הטובה ביותר

פעילות מתמטית קטנה

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

static inline int clamp(int value, int low, int high) {
 return (value < low) ? low : (value > high) ? high : value;
}

פונקציות Accessor ו-Motator במבנה נתונים

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

typedef struct {
 int x, y;
} Point;

static inline int point_get_x(const Point *p) {
 return p->x;
}

static inline void point_set_x(Point *p, int x) {
 p->x = x;
}

מערכות Embedded Systems and Real-Time Code

בסביבה עם שטח ערימה מוגבל דרישות תזמון תזמון , inline פונקציות לחסל את הצורך לדחוף / פופ מסגרת ערימה, הפחתת הן latency והן השימוש זיכרון.עם זאת, גודל הקוד חייב להיות במעקב בזהירות על microcontrols מאומנים זיכרון.

שם הסרטון: 0 (לא ברור)

  • (FLT:0)Large פונקציות: 1FLT:1 , תוך ציון 100 + קו פונקציה באתרי שיחות מרובים יניחו את הביצועים בינאריים וסביר להניח משפילים עקב לחץ מחיצה הוראה.
  • (ב) אין אפשרות ליישב את ה[[המאה ה-1]], אך לא ניתן ליישב את ה[[המאה ה-20]].
  • (ב) ⁇ :0 ⁇ עם לולאות: ⁇ 1 ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ויקרא ה': ויקרא ה': "ה' י' אלהים" (בראשית כ"ד, כ"ד) , ויקרא ה' (ב) , ויקרא כ"כ) , ו"ה' יראת ה'' (במדבר כ"ד).

פונקציות Inline Versus Macros: A השוואות מפורטות

לפני מילת המפתח של FLT:9 היה סטנדרטי, מתכנתים השתמשו מאקרו (FLT 10) כדי להשיג "inlining" - אבל מאקרו הם החלפת טקסט, לא פונקציות.

  • (ב) ,0) בטיחות טירוף: 1 מקרו מתעלם מטיפוסים.המאקרו המפורסם (FLT:11 ), מעריך טענות מספר פעמים, מה שמוביל לתופעות לוואי מסוכנות כאשר נעשה שימוש בביטויים כמו FLT:12:12 .
  • (ב) ,0) , ⁇ : "התעלמו" (בראשית כ"ד)
  • (ב) מדרש (ב"ג): "ה' (ב') ,ב' (ב') ,"ב' (ב') ,"ב) ,"ב' (ב', כ"ד).
  • (ב) ,0) התנגשויות שמות: התרחבות מקרו יכולה להפריע למשתנים מקומיים.

פונקציות איליין להתגבר על כל הנושאים האלה: הם פונקציות אמיתיות עם בדיקת סוג, היקף, והערכה של טיעון בטוח צד-תוצאה.הם משתתפים במערכת הטיפוס הרגילה, וניתן לחוסם, היתרון התיאורטי היחיד של מאקרו הוא שניתן להשתמש בהם עבור פעולות FLT:0type-genericFLT:1 - אבל C11F:14 ו- C23F15) הם צמצום הפערים שאפילו הם אלה.

(ב) ⁇ :0) ,[דרוש מקור]: [ה] [ה]] ,[דרוש מקור]] [ב]]], [ה], [ה]]]], [התחילת ה'], היא רק עבור קבועים פשוטים או הזנחה.

דוגמאות מעשיות: Inline Functions in Action

דוגמה 1: Square (Already Deliverd)

static inline int square(int x) {
 return x * x;
}

הלפיד כנראה לא יפלט שום הוראה כלל; הקוד הופך פשוט ל-FLT:18 בכל אתר אינטרנט.

דוגמה 2: לבדוק אם דמות היא Digit

static inline int is_digit(char c) {
 return c >= '0' && c <= '9';
}

דוגמה: Fast Min /MAX (Afreeing Macros)

static inline int imax(int a, int b) {
 return (a > b) ? a : b;
}

בניגוד לגרסה המאקרו, הדבר מעריך את ה-FLT:21 ו-FLT:22 בדיוק פעם אחת, הימנעות מסיכון כפול.

דוגמה 4: bit Operations (Unions or Byte Swapping)

static inline uint16_t swap_bytes(uint16_t x) {
 return (x << 8) | (x >> 8);
}

זה מאגד את ה-ARM, או כ-x86 כאשר הוא מוקרן.

אופטימיזציה של מילות המפתח ו-Inline מילות המפתח

מילת המפתח של ה-FLT:25 היא רק גורם אחד בהחלטה של מפרש.רוב המדפים יש דגלים קו פיקודי השולטים בתוקפנות:

  • (ב) ויקרא י"א: ויקרא י"ד: "ה' י"א ויקרא י"ד: "וַיָּבְהִיא עַל הָאָרֶץ אֲשֶׁר נָא אִתָּעָשָׂה אִם עַל עַל הָאָרֶץ" (במדבר כ"ד, ט"ד).
  • (ב) ,0.2%: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

דוגמה ל-GCC:

static inline __attribute__((always_inline)) int triple(int x) {
 return x * 3;
}

(לקוד ביקורתי של ביצועים, מומלץ לבדוק את ההרכבה שנוצרת (למשל, עם GCC של GCC LT:33 או FLT:34) כדי לאשר כי inlining התרחש.

מלכודות פוטנציאליות: Code Bloat ו- Binary Size

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

  • (ב) ⁇ :0 ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0) מערכות Embedded:FLT:1 Flash ו- RAM מוגבלים.A 10byte תפקוד בשימוש ב 1000 מקומות מוסיף כמעט 10KB של קוד.
  • (ב) ,0) ,ההרסה של ה-Cache: צופן גדול יותר יכול לגרום להפרעות מטמון יותר, להאט את התוכנית כולה.

כדי להפחית את קוד הנפיחות, השתמש בפונקציות קטנות באמת (בדרך כלל 1-5 הצהרות) השתמש בפרופילים כדי לזהות פונקציות חמות לפני בידוד.מד הן זמן ביצוע והן בגודל בינארי.

פונקציות באינטרנט ב- C Standards

(ב) [[1924]]]] [[1924]]]]]] [[1924]]]]]]]] [[1924]]]]]] [[1924]]]]]]]] [[1924]]]]]]]]]]]]]]]] [[1924]]]]]]]]]] ו[[1924]]]]]]]] [[1924]]]]]]]]]]]] [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[1924]]]]]]]]]]]]]]]]]]]]]] [[1924]]]]]]]] [[1924]]]]]]]]]]]]]]]]]] [[1924]]]]]]]]]] [[1924]]]]]] [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[1924]] [[1924]]]]]]]]]]]]]] [[1924]]]]]]]]]]]]]]]] [[1924]]]]]] [[[[1924]]]]]] [[[[1924]]]]]]]] [[1924]]]]]]]] [[[[1924]]]]]]]] [[[[1924]]]] [[[[1924]]]]]]]] [[[[1924]]]]]]]] [[[[[[1924]]]]]]

אם אתה צריך לתמוך לפני C99 מדגמים (אשר נדיר יותר ויותר), עליך ליפול חזרה למאקרו או יישומים חיצוניים בלבד.

מסקנה: כלי אסטרטגי ב-Competation's Toolkit

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

(ב) ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]] ו[[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]]]]