כמות נתונים

fortus

New member
כמות נתונים

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

דעתכם?
 

Guy Yafe

New member
תשובה

כמות המשתנים שניתן להגדיר במחסנית נובעת מגודל המחסנית המירבי.
גודל ברירת המחדל בלינוקס למשל (לפחות במכונה עליה אני עובד) הוא 8MB.
גודל הערימה לעומת זאת הרבה יותר גדול: הוא מתקרב ל4GB במערכות 23 ביט, וריבוע של זה במערכות 64 ביט.

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

BravoMan

Active member
דעתי האישית:

התיאור שלך כללי מידי.

לא ברור מה אתה עושה, אלו אילוצים יש, באיזו שפה אתה כותב ומה צריכה להיות התוצאה.

ניהול זיכרון והגדרת המשתנים צריכים להתאים לכל מקרה ספציפי.
בגדול, יש כלל שאומר לא להגזים עם השימוש במחסנית, אבל אם אם יש לך הרבה משתנים נפרדים מסוג int למשל (ואני כרגע מדבר על שפת C או ++C), זה שתעביר אותם ל-heap ותשמור מצביע לכל אחד לא יצור חסכון.
למעשה, זה יצור בזבוז כפול של זיכרון, או אפילו משולש עם אתה עובד במערכת 64bit שם כל מצביע לוקח 8 בית.

מצד שני, אם יש לך מערך גדול, ואני מתכוון של אלפי איברים, הגיוני להקצות אותו על ה-heap ולא על ה-stack אם כי במקרים מסוימים אפשר לוותר על הכלל הזה.

בכל מקרה יש לזכור שזיכרון שתוכנה יכולה להקצות הן על ה-heap והן על ה-stack הוא סופי ולהתנהג בהתאם.
 

fortus

New member
יותר פרטים

(כל ניהול מבנה הזכרון הוא ב- C++ )
אני אמור להחזיק בזכרון מבנה נתונים כלשהו
(כאשר מבנה הנתונים מכיל ווקטור של אובייקטים )
(כל אובייקט כנ"ל מכיל ווקטור של זוגות )
עכשיו כמות הכניסות במבנה הנתונים היא עצומה אני מדבר במונחים של 2 בחזקת 15 וזה יכול להגיע גם ל- 2 בחזקת 30 ויותר מזה
זה משתנה במהלך הריצה

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

בתודה מראש
 

selalerer

New member
אם אתה מדבר על std::vector אז ההקצאות שלו....

....הן תמיד ב-heap.

גם אם אתה מחזיק אותו על ה-stack ההקצאות שהוא עושה בעצמו כשאתה מכניס לו איברים הם על ה-heap.
 

nocgod

New member
בגדול מהתיאור שלך אני מבין ש...

אתה הולך לעבוד עם הרבה הקצאות דינמיות ומכאן שכל הדבר הזה ישב על הheap לעומת זאת המצביעים אל ההקצאות זיכרון האלה (כלומר המשתנה שיחזיק את ערך הכתובת לאובייקט בheap) ישב על הstack. יותר מזה אם אתה עושה מערך דינאמי של מצביעים אז כל מה שישב לך על הstack יהיה המצביע למערך (לאיבר הראשון במערך) ושאר המצביעים במערך ישבו על הheap...

בגדול כל דבר שאתה מגדיר במהלך התוכנות במבנה פרימיטיבי (int x וכו') ישבו על הstack כל דבר אשר לו אתה עושה הקצאה באמצעות new ישב על ה heap
 
למעלה