שיחה:C++/זיכרון דינמי

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש

define[עריכה]

משעשע השימוש ב-define יחד עם new בספר העוסק ב-CPP וטורח לציין שלגבי הקצאה דינאמית "יש ב-++‎C יש כלים מתקדמים יותר"... ‏conio.h‏ • ‏שיחה‏ 00:44, 18 יולי 2006 (IDT)

למה בדיוק אתה מתכוון? דרורק 17:25, 18 יולי 2006 (IDT)
אני מתכוון ששימוש ב-define ב-CPP לכל צורך מלבד טיפול בהכללות של דפי include הוא שגיאה גמורה ומוחלטת. לכל שימוש אחר יש חלופה: typedef, const ו-inline functions. ‏conio.h‏ • ‏שיחה‏ 17:52, 18 יולי 2006 (IDT)
אני חושב שאתה קצת מגזים. "שגיאה גמורה ומוחלטת. לכל שימוש אחר יש חלופה" אני בטוח שאני יכול למצוא כמה שימושים נחמדים ל-define והגדרת קבועים של המכונה יכולה בהחלט להיות אחד מהם. אתה לא מסכים? דרורק 20:53, 18 יולי 2006 (IDT)
לא, אני לא מגזים. שימוש ב-define לכל מטרה שקיימת לה חלופה עדיפה של CPP הוא טעות. אולי כדאי שתציץ בפרק הראשון של Effective C++: 55 Specific Ways to Improve Your Programs and Designs (Third Edition)‎. אני מניח שיכולים להיות מקרים אולטרה-נדירים שבהם יכול להיות שיש תועלת בשימוש ב-define (מלבד טיפול בהכללת קבצים), אבל זה לא המצב כאן. באופן כללי - כלל האצבע אומר שכל דבר (מלבד טיפול בהכללת קבצים) שאפשר לעשות בלי define (כלומר, כל דבר) צריך לעשות בלי define. זה הכל. ‏conio.h‏ • ‏שיחה‏ 22:13, 18 יולי 2006 (IDT)
אני מצטרף (אם כי כל מי שמצטט את מאיירס זוכה מיידית בתמיכה שלי). אני גם כן לא מצליח לראות שימוש יעיל ל-define שלא ניתן להחליף, פרט לזה שצוין לעיל. גדי אלכסנדרוביץ' 16:52, 19 יולי 2006 (IDT)
האמת שגם אני מסכים אבל הגישה של "משעשע השימוש ב-define יחד עם new בספר..." וגו' היא גישה מעליבה ומתנשאת (לא אותי - אני לא כתבתי את המאמר הזה). ויקיספר הוא לא מקום לגישה כזו. אם אתה (conio.h) חושב שהשימוש הוא "מצחיק" אז תשנה את זה. אל תרד על אלו שכותבים. דרורק 17:24, 19 יולי 2006 (IDT)
אני מסכים. כדאי לשמור על אווירה ידידותית יותר. עם זאת, זכור ש-C היא נושא רגיש מאוד, שגורם לאמוציות חזקות - שאל כל מתכנת שנאלץ לעבור על קוד שכתב מישהו אחר ולהתמודד עם חוסר יכולת התכנות המינימלית של אותו מישהו. גדי אלכסנדרוביץ' 09:40, 20 יולי 2006 (IDT)
בוודאי. אני מסכים לחלוטין ואני חס-וחלילה לא רומז שצריך לא לתקן או לוותר על סטנדרטים גבוהים. דרורק 18:11, 20 יולי 2006 (IDT)
בתור חובב של מיירס אינך אובייקטיבי ;-)
בכל-אופן, המטרה לא הייתה להעליב, אלא מלבד ההערה הספציפית הזו לגבי ה-define להזכיר משהו כללי יותר: C++‎ איננה C with classes, זו גם לא "C עם תבניות", לא "C עם תחביר מוזר לקאסטינג" או "C שבה פתאום דברים עובדים מוזר" (בדף הבית של סטרוסטרופ אפשר לקרוא תקציר דתקציר על הנושא). זה שקיימת תאימות לאחור (בערך) עם C, לא אומר שכל מה שהיה מותר ב-C מותר לעשות גם ב-CPP. זה יתקמפל, אבל זה לא נכון. כשכותבים ספר על CPP צריך להיות מודע במשך כל הכתיבה שלא מדובר ב-C משופצרת, אלא בשפה שונה לחלוטין. (מה גם ששימוש ב-define להצהרת קבועים מיותר כבר ב-ANSI C; רק ב-K&R C עדיין לא היו const-ים)
אגב, גדי - שמת לב להבדלים מוזרים בין המהדורה הראשונה והשניה לשלישית של Effective C++‎? ‏conio.h‏ • ‏שיחה‏ 18:14, 23 יולי 2006 (IDT)

מצאתי עוד מישהו שאומר שאין להשתמש ב-define לשום דבר מלבד טיפול בהכללה כפולה של קבצי כותר, והפעם, לא מדובר בסופר, שיכול להיות שסתם מדבר באוויר, אלא בחברת לוקהיד מרטין. כדאי להציץ בסטנדרטי כתיבת קוד CPP שלהם לפרוייקט ה-JSF[1]. ראו את §4.6 ובמיוחד את §4.6.2. סתם להשכלה כללית. :) ‏conio.h‏ • ‏שיחה‏ 03:50, 24 יולי 2006 (IDT)

ומה לגבי פונקציה שאחד מהפרמטרים שלה הוא טיפוס? (כולל טיפוס שהוגדר על ידי המתכנת)--80.178.121.5 15:56, 5 בספטמבר 2006 (IDT)
מה הקשר? דרורק 21:43, 9 בספטמבר 2006 (IDT)
באמת מה הקשר בין define ל-new ?


80.178.88.166 11:02, 14 בספטמבר 2006 (IDT)

אין שום מגבלה להשתמש ב-define, חוץ מזה שזה נחשב לסגנון פחוט טוב, וזה יכול ליצור בעיות ששימוש באמצעים אחרים ב-C++ פותר בצורה טובה. כמובן עדיף להשתמש ב- const לקבועים, ועדיף לעשות שימוש ב-template במקרה ויש צורך במה שנקרא meta-programming, אבל אף אחד עדיין לא הוציא את define מ-C++. כמוכן ל-preprocessor של C++ יש שימוש. יותר על זה אפשר ללמוד ב-www.boost.org. אני גם לא חושב שכדאי להציג בספר זה תפיסה של אותו בן אדם או אחר, או סיגנון התכנות שלו, יש אנשים שלומדים C++ מספר של בן אדם שיש לו תפיסה ספציפית לגבי השפה ולאחר מכן חושבים שכך הם הדברים, כי הכותב הספר הוא מומחה. זאת טעות. ב-C++ יש כל מיני אפשרויות וחלקן פחות טובות מאחרות לצרכים מסויימים. בסופו של דבר לא מדובר פה בעותק של ספר של סופר כלשהו בניסוח מחודש, או נסיון להפיץ את שיטות התכנות שלו, אלא בספר שמכסה את שפת התכנות בכללי. עם זאת אני מודה שזו היתה טעות מצידי להשתמש ב-define, לצורך הצהרת קבועים ב-גרסה המקורית של פרק זה, אך אני רואה שזה פתח דיון מעניין ויתכן והדיון הזה תרם לאנשים שכותבים את הספר. 132.69.234.217 16:46, 9 ביוני 2007 (IDT)

אכן יש צורך לציין באיזשהו מקום שכדאי לא להשתמש בDEFINE אם יש לו תחליף. אבל לאדם יש נטייה ללמוד ממקור המידע הראשון, להתיחס אליו כלאמת האמיתות ובעתיד לכתוב בסגנון זה (יש לי ניסיון). דווקא בגלל זה הספר צריך להציג את הסגנון הטוב, המקובל והנהוג שבשפה. הסגנון כולל גם את השימוש (והאי-שימוש) בDEFINE, גם את ההזחות, הרווחים, מיקום הסוגריים וסגנון תכנות עצמו (פירוק לפונקציות, מתן שמות וכד'). כמובן שיש סגנונות שונים, אז צריך להמציא דרך כיצד להתמודד עם הבעיה בספר זה. Ybungalobill 11:44, 12 ביוני 2007 (IDT)

realloc[עריכה]

הממ, תגידו, אין איזה פתרון יותר טוב לזה? זה לא רעיון טוב להעתיק תוכן של כל הזכרון למקום אחר במקום REALLOC. זה עלול להיות בזבזני בטירוף דרורק 20:55, 18 יולי 2006 (IDT)

תשובה[עריכה]

אין. אתה יכול להשתמש ב-containerים של STL של C++, שמקצים מראש יותר זיכרון ממה שצריך (במקרים מסויימים) ואז אם יש צורך ביותר זיכרון, אז יש סיכוי שהוא כבר זמין. שלא יהיו טעויות, realloc פועל בדיוק באותה צורה. הוא מקצה מקום חדש בזיכרון ומעתיק את כל הנתונים לשם. בסוף כמובן הוא משחרר את הזיכרון הישן. אין כאן חוכמות. הדרך היעילה ביותר לנהל את הזיכרון זה לא להתעסק בניהול זיכרון בכלל, אלה להשתמש ב-vector וחבריו. מצביעים וניהול זיכרון מכניסים לא מעט בלגאן לתוכנה, כי צריך לדאוג שזה יעבוד בצורה תקינה. אם קיים צורך בניהול זיכרון בכל זאת, אז צריך לכתוב מחלקה נפרדת שתעשה זאת (אלא אם כן מדובר בתוכנה קטנה). כמו כן לכל מיני טריקים שאפשר לעשות ראו גם www.boost.org

132.69.234.217 16:28, 9 ביוני 2007 (IDT)

לא מדוייק, REALLOC לא תמיד מעתיק לאזור חדש, REALLOC יכול לבדוק האם יש מקום פנוי בעירמה אחרי האזור שאנו רוצים להגדיל, אם במקרה יש אז הוא רק מעדכן את הנתונים על גודל האזור הזה. אתה מוזמן לבדוק שREALLOC לפעמים מחזיר את אותו המצביע.
16:43, 9 ביוני 2007 (IDT)

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

בשום מקום גם לא כתוב שהוא חייב תמיד להקצות זיכרון חדש. תכלית טענתי הייתה שקריאה ל-realloc עדיפה על קריאה ל-malloc, memcpy ו-free, ולא כי היא תקצר את הקוד אלא כי יתכן שהיא בכלל לא תבצע העתקה. ומבחינת הדברים שאמרתי זה לא יכול לעבוד "קצת" שונה, זה או מעתיק תמיד לזיכרון חדש (מימוש טריוויאלי) או לפעמים מגדיל את הזיכרון הקיים (יש צורך בתמיכה מצד מערכת ההפעלה). הקיימות כאן אפשרויות נוספות?
וכן, אין לך כלים תקניים ב-C++ לעבודה עם הערימה.
ybungalobill 10:28, 16 בפברואר 2008 (IST)

תוכן[עריכה]

התוכן נעלם לי, או שבאמת אין כאן תוכן? (של כל הספר)

אני רואה תוכן (יש מידע בתוך הערך, קיים תוכן עניינים, חלק מתוכן העניינים כחול). גדי אלכסנדרוביץ' 16:25, 24 יולי 2006 (IDT)