25-11-2012, 20:54
|
|
|
|
חבר מתאריך: 14.12.09
הודעות: 9,751
|
|
ציטוט:
במקור נכתב על ידי inspired-session
סלח לי על הבורות שעלולה לעלות מהשאלה הזו, אך להקצות כל פעם באפר בגודל מקסימלי זה לא בזבוז משאבים?
או שמא הייתה הכוונה שהבאפר יוקצה פעם אחת ומחרוזות יקלטו באמצעותו למשתנים אחרים שיוקצו דינאמית אחרי שיודעים מה אורך המחרוזת?
|
תאורטית - כן.
פרקטית - כנראה שלא.דוגמה:
מה זה fgets? זה בעצם 1 מבאפר אחד (איפה ששורת הקלט יושבת עכשיו) לבאפר השני, שאתה מספק לפונקציה.
ראה כאן, לדוגמה: http://www.freebsd.org/cgi/cvsweb.c...pe=text%2Fplain
נגיד שהגודל המקסימלי לשורת קלט היא 64K ואנחנו עובדים עם דפי זיכרון בגודל 4K. אתה יכול גם להגיד שהגודל המקסימלי לשורת
פקודה הוא 256K, או 10MB מצדי אפילו.
כשאתה מבקש ממערכת ההפעלה 10MB, היא לא באמת מפנה שלך 10MB של זיכרון פיזי. היא יכולה, אבל היא ממש לא חייבת, ואם
היא לא מפגרת היא גם לא תעשה את זה. מערכת ההפעלה אומרת לך "כן אחי. בכיף. יש'ך 10MB החל מהכתובת 0x12345678.",
אבל לא באמת מתחילה להזיז דברים בזיכרון רק כי אמרת שאתה אולי תשתמש ב-10MB מתישהו בעתיד.
ברגע שאתה מתחיל להעתיק מידע לתוך הבאפר שהקצית, מערכת ההפעלה דואגת שבאמת יהיה זיכרון לכתוב אליו. האם היא ישר
מסדרת לך 10MB פיזיים? אולי כן ואולי לא. לא בטוח שכן. אולי היא דוחה הכל, וכל פעם מחכה ל-PF ומסדרת לך זיכרון פיזי ביחידות
של 4K, לפי הדרישה?
אולי היא משתמשת בגישה אחרת כלשהי? אולי באיזו יוריסטיקה על ההתנהגות של התוכנה?
כל עוד לא יצרת בעיה של מחסור בכתובות וירטואליות, כשאתה מקצה באפר בגודל מסויים זה רק רמז למע"ה כמה זיכרון פיזי להקצות
לך, לא משהו שהיא באמת צריכה להתייחס אליו כהוראה מחייבת.
חוץ מזה, תנסה ותראה. premature optimization is the root of all evil. קודם כותבים קוד. אח"כ עושים profiling, אם יש בעיה מתקנים.*
_____________________________________
(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס
אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
|