logo

איסוף אשפה ב-C

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

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

 void* malloc(size_t size); void free(void* ptr); 

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

בחר multi table sql

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

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

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

pd מיזוג

תחביר:

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

 #include void* GC_malloc(size_t size); void* GC_calloc(size_tnmemb, size_t size); void* GC_realloc(void* ptr, size_t size); void GC_free(void* ptr); 

בתחביר זה, ה הפונקציה GC_calloc(). משמש להקצאת זיכרון ולאתחול אליו אֶפֶס , ואילו ה הפונקציה GC_malloc(). מקצה זיכרון באופן דינמי. דומה ל שיטת realloc(). ב-C, ה GC_realloc() הפונקציה משמשת להקצאה מחדש של זיכרון. שחרור הזיכרון מתבצע באמצעות שיטת GC_free() .

בואו נסתכל על איור של בוהם-דמרס-וייזר ספריית אספני האשפה בפעולה. התוכנית הבאה משתמשת ב- הפונקציה GC_malloc(). כדי להקצות זיכרון לכל צומת בזמן שהוא בונה רשימה מקושרת של מספרים שלמים. לאחר מכן, ערכי הרשימה המקושרת מודפסים, ולאחר מכן התוכנית מסתיימת.

 #include #include typedef struct node { int value; struct node* next; } node; int main() { GC_INIT(); node* head = GC_malloc(sizeof(node)); node* current = head; for (int i = 1; ivalue = i; current->next = GC_malloc(sizeof(node)); current = current->next; } current->next = NULL; current = head; while (current != NULL) { printf('%d
', current->value); current = current->next; } return 0; } 

תְפוּקָה:

הפלט הבא מופק בעת הפעלת התוכנית:

אלפבית ומספרים
 1 2 3 4 5 6 7 8 9 10 

הֶסבֵּר:

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

באמצעות א בעוד לולאה כדי לעבור על הרשימה ולהדפיס את הערך של כל צומת, ואז נדפיס את הערכים ברשימה המקושרת. לבסוף, אנחנו החזר 0 כדי להראות שהתוכנית רצה בהצלחה.

סיכום

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

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