עבור לתוכן

שאלה קטנה - היכן מאוכסן פוינטר?

Featured Replies

פורסם

שלום,

תהיתי לעצמי, היכן מאוכסן פוינטר? ב-HEAP או במחסנית?

תודה מראש :xyxthumbs:

פורסם

כל משתנה שהוגדר סטטית (ע"י הצהרה ישירה) יושב במחסנית.

כל משתנה שהוגדר דינמית (ע"י הקצאת זכרון באמצעות new) יושב ב-heap.

כשאתה מגדיר ככה:

int* p = new int;

אז p יושב במחסנית, אבל הערך שאליו מצביע p יושב ב-heap.

פורסם

פוינטר הוא datatype כמו int וכל דבר אחר, ולכן אותם כללים חלים עליו.

פורסם

לפעמים הפוינטר לא נמצא עם הheap או על המחסנית כי הוא נמצע ברגיסטר אחרי שהאופטימיזר עובר עליו. במערכות PPC וRISC יש סטנדרטים של העברת פרמטרים דרך רגיסטרים . היתה למישהו בעבודה שלי בעיה שקשורה להקצאות זיכרון בC שקשורה לנושא. הוא רצה להקצות מערך של 3 מגה והיה לו איזה 20 מגה פנויים אבל בגלל שהיתה פרגמנתציה בheap הוא לא הצליח בגלל שבלוק הרציף הכי גדול שהיה בheap הוא של 2 מגה .

מה שאפשר לעשות זה defragment לזיכרון ב heap אבל ב c זה קרוב לבלתי אפשרי כי אין מעקב של איזה מצביע מצביע לאיזה בלוק זיכרון שמוקצא או לתוכו . בjava יש כזה דבר קודם כל כי אין מצביעים של ממש יש רק reference שזה מצביעים בעלי יכולת מאוד מוגבלת והם מוגנים על ידי המערכת . המערכת הקצאת זיכרון יודעת מי מצביע לכל בלוק זיכרון . מתי ששום דבר לא מצביע לבלוק זיכרון מוקצא המערכת משחררת אותו . בjava יש פחות בעיה של פרגמנטציה כי המערכת מסוגלת להחליף את הבלוקים בזמן אמת בלי שהתוכנית תרגיש.

פורסם

גם ב C יש כל מני מנהלי זיכרונות (לא אלו שבספריות הסטנדרטיוט) שאמורות לטפל בנושא הפרגמנטציה.

ארכיון

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

דיונים חדשים