heap vs stack

sadov

New member
heap vs stack

אני צריך להכין הרצאה בנושא heap vs stack לעומק (c\cpp) איך עובד ? מהירות ? יתרונות וחסרונות... יש למישהו חומר בנושא, ebook, לינק... תודה איתי
 

voguemaster

New member
הדבר היחיד שאני יכול להציע בנושא

הוא מאמר (מצוין ד"א!) לגבי BUFFER OVERFLOWS ב-HEAP/STACK, וכד´. לא בדיוק קשור למה שאתה צריך, אבל אם תרצה... אני מניח שמדי פעם תהיה פיסת מידע רלוונטית בשבילך (אני מאמין). אלי נ.ב. העצלנות גורמת לי לא להחליף כיוון כתיבה, לכן יוצאות לי אותיות גדולות (SHIFT!!).. תראו למה העצלנות גורמת... חחח..
 

yair24

Member
באיזה הקשר?

אפשר אולי לנסות לפתח כאן דיון על HEAP וSTACK ולראות מה יצא: נתחיל עם כמה שאלות שיכולות לתת כיון להרצאה: כשמגדירים משתנה בצורה הבאה:
INT X​
איפה הוא ישב בHEAP או בSTACK? ואם אני מגדיר ככה:
int *x=new int()​
איפה עכשיו הוא ישב? מה הסיבה שזה ככה ולא הפוך? מתי הקשר בין הריסת משתנה לבין איפה שהוא יושב (בHEAP או בSTACK)? אפשר גם לתת תוכנית עם מספר משתנים שמאותחלים אחד אחרי השני ולשאול את הכיתה מה יהיה סדר ההריסה של כל משתנה. מקווה שקלעתי למה שאתה צריך... אם יש למישהו הערות או תוספות או תיקונים אז בבקשה. יאיר
 

sadov

New member
יותר לעומק

ההרצאה שאני רוצה להעביר צריכה לעסוק בנושא יותר לעומק, לא רק איפה מוגדרים המשתנים (heap או stack) ומה ה SCOPE שלהם אלה גם מה התהליכים שמתבצעים בהגדרת משתנה ב HEAP לאומת ה STACK מה יותר מהיר? למה? יתרונות וחסרונות של כל שיטה, בעיות אופיניות פתרונות וגם קצת להכנס לקוד ASEMBLY בהרצת דוגמה ב DEBUG.
 

yair24

Member
יכול להיות מעניין...

אם תמצא חומר שלח לי אותו בבקשה. יאיר
 

mmuse

New member
למה אתה מתכוון?

ערימה ומחסנית אלו מבני קבצים. את שניהם ניתן לממש ע"י מערך או רשימה... מה זאת אומרת איפה מוגדרים המשתנים, ולאיזה קוד אסמבלי אתה מתכוון? ההבדל בין ערימה למחסנית הוא שמחסנית זה FILO, כלומר: First In Last Out וערימה זה FIFO, כלומר: First In First Out. ההבדל הוא לא בתוכן או בצורה, אלא במימוש -מאיפה מכניסים משתנים, מאיפה מוציאים משתנים (מההתחלה או מהסוף). בקשר לשאלה מה יותר יעיל, זה תלוי בדרישות התוכנית. זה לא שני דרכים לממש אותו דבר, אלא שני דברים שונים.
 
זאת לא הייתה הכוונה שלו

אם הבנתי נכונה הוא מתכוון לחלקים בזיכרון (הפיזי) שמוגדרים עבור המחסנית ועבור הHEAP ד"א אתה צריך את זה להרצאה במ"ת?
 

voguemaster

New member
כן, לדוגמא:

בווינדוס, כל פונקציה שמוגדרת בצורה STDCALL פועלת באופי הבא: תפקידה של הפונקציה לתפעל את המחסנית עבור משתנים לוקאליים. בכניסה, בחלק שנקרא PROLOG ליצור את ה-STACK FRAME ובסיום להחזיר את המחסנית למצבה הקודם. בנוסף, משתנים שמועברים לפוקנציה אמורים להימצא כבר על המחסנית כשהפונקציה מתחילה. דוגמא:
here is a function entry point: push EBP mov ebp,esp sub esp,XXXX . . . . add esp,XXXX pop ebp ret YYYY​
מה שקורה כאן הוא דבר פשוט. הערך של EBP נשמר על המחסנית ואז הוא מקבל את הערך של ESP הנוכחי. מקטינים את ESP כדי להקצות יותר מקום על המחסנית עבור משתנים לוקאליים, ואז הפונקציה מתחילה בעיקרון. משתמשים ב-EBP בד"כ כדי לגשת למשתנים. היסט שלילי עבור ה-LOCALS והיסט חיובי עבור המשתנים שהועברו לפוקנציה (שנדחפו למחסנית לפני הקריאה לפונקציה ובסדר הפוך!! שימו לב אנחנו ב-STDCALL). אחרי שהפונקציה מסתיימת, אפשר להחזיר את ESP בחזרה ולשחזר את EBP. אם צריך אפשר להוסיף שינוי של המחסנית גם ב-RET עצמו, כדי להתאים אותה למצבה הקודם (לדוגמא ניקוי של המקום שתפסו הארגומנטים של הפונקציה). הערה קטנה: יש קומפיילרים שיכולים ליצור קוד שלא מייצר STACK FRAME כזה. עד כמה שידוע לי בתור ברירת מחדל VCPP עושה את זה.. אלי נ.ב. מקווה שהדוגמא במקום
 
למעלה