עבור לתוכן

"כיווץ" זיכרון בהרצת תוכנית C

Featured Replies

פורסם

שלום,

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

int a[10];
int b[10];
int c[10];

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

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

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

השאלה שלי היא מה הפעלה הזו שהוא עושה כדי שאני אוכל לעשות אותה בבית ולבדוק את עצמי לפני שאני מגיש את העבודה.

האם זה תוכנה חיצונית שעושה את זה?

האם זו פונקציה ב-C שמאלצת סוג כתיבה כזה לזיכרון?

האם זו אופציה בקומפיילר או בויז'ואל סי שאפשר להגדיר?

תודה מראש :)

פורסם

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

int *a = (int*)malloc(100*sizeof(int));
int *b = (int*)malloc(100*sizeof(int));
int *c = (int*)malloc(100*sizeof(int));

אז הם באמת לא היו יושבים ברצף.

מה שהבודק עושה זה כנראה להריץ תוכנה שבודקת דליפות/דריכות זכרון, כגון Purify.

פורסם

תריץ את התוכנית שלך בRELEASE, ואז לא יכנסו כל מיני רווחים.

שים לב, שאתה יכול להוסיף גם את המילה pragma pack(1) ואז לא יתווספו לך רווחים שנוצרים כתוצאה מיישור.

ארכיון

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

דיונים חדשים