שאלה לי,

זויברג

New member
שאלה לי,

יש לי באלגן בראש בנוגע לכל מה שקשור למקום שהקומפיילר של C מגדיר את המשתנים. אילו משתנים מוגדרים בStack? אילו משתנים מוגדרים בHeap?, כשאני קורא לפונקציה, איפה נשמרים הפרמטרים? אני עובד הרבה בזמן האחרון באסמבלי, ושם הכל ברור מה נשמר איפה. ב-C, מה נשמר בDS ומה נשמר בES? מה Far ומה Near? מישהו יכול לעשות לי סדר בבאלגן? בבקשה?
 

vinney

Well-known member
שמישהו יעשה לך קורס קומפיילרים...

בחמש דקות
משתנים גלובליים מוגדרים בdata segment ששמור בקובץ התוכנית וגודלו קבוע מתשנים מקומיים בפונקציות נשמרים ב stack, נוצרים עם כניסה לפונקציה ונעלמים עם היציאה. כנ"ל פרצטרים לפונקציות. הקצאות דינאציות של הזכרון (malloc, new) מוקצות מהheap. near ו far זה ממקום אחר לגמרי - מדובר בהגדרות ניהול זכרון של התוכנית. תוכניות קומפקטיות נכנסות לסגמנט אחד של נתונים (COM ב DOS) - זהו מודל הtiny. תוכניות שיש להן סגמנט קוד אחד, סגמנט נתונים אחד וסגמנט מחסנית/ערימה אחד משתמשות במודל small. שאר משתמשות במודלים huge ו large. הקריאות בין סגמנטים מתבצעות בעזרת מצביעים מלאים (far), בתוך סגמנט - באמצעות היסט מנקודה כלשהי בסגמנט (near).
 

ברנדל

New member
שאלה מצוינת

א. stack נשמרים שם כל המשתנים שעוברים כפרמטרים לפונקציה + המשתנים שאתה מגדיר בתוך הפונקציה (אלא אם כן הגדרת אותם כדינמיים עם new או malloc). תחשוב על זה בהגיון, הם נדחפים למחסנית ומשתחררים ברגע שהפונקציה נגמרת. תחשוב נניח על קריאה של פונקציה מתוך פונקציה, קודם נדחפים הפרמטרים בפונקציה החיצונית ולאחר מכן נדחפים אלה שבקריאה לפונקציה הפנימית, הם משתחררים קודם שהפנימית משתחררת ואז שהחיצונית, מקווה שאתה מבין למה steak שעובד בצורה של LIFO מתאים פה. ב. static storage או data storage: נשמרים שם כל המשתנים הגלובליים והסטטים שתקפים לכל אורך התוכנית מרגע יצירתה. שים לב שגם משתנים גלובליים שאינם סטטיים נשמרים ב static storage, ולכן ערכם ההתחלתי 0 אם לא הקצית להם ערך. ג. heap מקום מיוחד שבו נשמרים כל המשתנים שמוקצים באופן דינמי. הם יכולים להיות מוגדרים גם בתוך פונקציה, אבל עדיין יוקצו על ה heap ולא על ה steak, ולכן לא ישוחררו כאשר הפונקציה תגיע לקיצה קבל דוגמא:
int func() { int *p = new int; return 0; }​
בוא נבדיל בין כמה דברים. המשתנה p הוא בעצם מצביע שזה אומר משתנה לכל דבר (יש לו כתובת בזיכרון) שמהווה מצביע על כתובת אחרת. הכתובת של המשתנה עצמו p תוקצה על המחסנית ותשתחרר כאשר הפונקציה תגמר, אבל הכתובת אליה הוא מצביע לא תשתחרר כיוון שהיא מוקצית על ה heap.
 
למעלה