ניהול זיכרון בc++.net?

tseliot

New member
ניהול זיכרון בc++.net?

מישהו יכול לעזור לי להבין איך ניהול הזיכרון עובד בc++.net? תמיד חשבתי שהיתרון (וגם החסרון במידת מה) בc++ הוא שניהול הזיכרון נעשה על ידי המתכנת. עכשיו אני מנסה להתרגל למעבר מC# ל++C, ופתאום שמתי לב שכשהשתמשתי באוביקט System::Drawing::pen, הקומפיילר רשם לי הודעת שגיאה של שימוש בקוד מנוהל באזור שאמור להיות לא מנוהל... זה הדליק אצלי נורה אדומה. אז מה בדיוק הולך שמה? מה בדיוק שינו בc++ במעבר ל.net?
 

Zeliran

New member
Garabage Collector

בפלטפורמת הדוט נט הסירו את הצורך מהמתכנת לנהל את הזיכרון בעצמו, לשם כך הביאו את ה Garabage Collector שתפקידו הוא לשחרר אוטומטית אובייקטים שסימת להשתמש בהם. הוא רץ לבד ברקע כל הזמן ודואג לזכרון בלי צורך להתערבות מצד המתכנת. למרות זאת ה GC לא מטפל בכל סוגי האובייקטים וקיימים אובייקטים שזהו תפקידו של המתכנת לזחרר מהזיכרון, לשם כך קיימת המטודה Dispose() אבל אם אתה מתעקש לנהל את הזיכרון בעצמך, קיימת אפשרות לכתוב גם מה שנקרא: Unmanaged Code שבו בעצם ה GC לא מתערב ונותן לך לעשות את כל ה"עבודה השחורה"
 

tseliot

New member
לא ענית על שאלתי ../images/Emo13.gif

כאמור, אני תכנתתי בסביבת .net, רק עם C#. אני יודע מה זה הClr והgc. השאלה שלי התייחסה ספציפית לc++. הנחתי שהיא עדיין תהיה unmanaged, מכיוון שאחרת פרט להורשה מרובה אני לא רואה שום סיבה להעדיף אותה על C# או Java. מישהו יכול להסביר לי מה הולך?
 

סומבודי

New member
אין סיבה

להעדיף את C++.NET, בודאי לא על פני C#, אלא אם אכן אתה כותב מעטפת לרכיב חומרה, או משתמש בקוד טבעי. הקוד שנכתב בחלק ה-managed של C++ מקומפל ל-IL בדיוק כמו כל שפה אחרת, בעוד החלקים הבלתי מנוהלים מקומפלים לשפת מכונה. ההפרדה בין חלקי הקוד נעשית באמצעות #pragma. בשורה התחתונה, C++, ובפרט בגירסה החדשה C++/CLI שמגיעה עם 2.0, מאפשרת גמישות, תאימות לאחור, OOP מלא, ושימוש ב-CLR, שזהו היתרון המשמעותי ביותר.
 

tseliot

New member
עדיין לא ברור לי...

גיד מי שכותב היום משחקים ולכן מאוד חשובה לו מהירות הביצוע, לא יעבוד עם c++.net אלא עםvc6? או שמא הוא פשוט יעבוד עם כל הקוד ב.net, אבל במצב unsafe... מה בדיוק?
 

Zeliran

New member
סביר להניח...

שאדם שרוצה לכתוב תוכנית בה המהירות היא אלמנט קריטי, סביר להניח שהוא יכתוב בשפה שיותר קרובה לשפת מכונה, כגון C\C++ אשר אם תבדוק, רצה לרוב (תלוי בדיוק מה התוכנית מבצעת..) יותר מהר מאשר תוכנית דוט נט.. אבל כאמור לכל שפה יש את החסרונות וההיתרונות שלה, ואפשר לומר שכל שפה מיועדת למטרות שונות.. לכן יש דברים שתעשה עם c ויש דברים שתעשה עם c# לכן לפעמים כאשר בונים תוכנית בה חלק ממנה דורש ביצועים גבוהים - יתכן שאת החלק הזה יכתבו ב c++ ואת שאר התוכנית ב C# למשל..
 

tseliot

New member
אבל עדיין לא ענית לי...

האם מההבדל בין c++.net לvc++6 מי שמהירות חשובה לו ימשיך לעבוד בvc++6, כדי שהיא תהיה לגמרי unmanaged?
 

Zeliran

New member
לא רק

קיימים הרבה הבדלים, בעיקר בגלל ש c++.net היא שפה דוט נטית לכל דבר.. ההבדלים במהירויות לא מתבטאים רק בגלל ניהול הזיכרון.. הסיבה הפשוטה היא ש c++ מתקמפלת לשפת מכונה בעוד ש c++.net (וכל שפה דוט נטית אחרת) מתקמפלת ל MSIL, שזה לא בדיוק שפת מכונה, ולא בדיוק שפה עילית... היא נמצאת איפשהו ביניהם.. ושמה בישראל "שפה מתקדמת" כך למעשה אתה מקמפל פעמיים את התוכנית כשאתה רוצה להריץ אותה, פעם ראשונה בדיבאג ל IL ופעם שניה בהרצת התוכנית.. (אם אני לא טועה
) היכנשהוא בכל הטרנספורמציה (
) הזו של הקוד וגם בגלל השימוש ב GC ועוד מיליון ואחד דברים אחרים, קיים הבדל במהירויות הריצה בין תוכנית שנכתבה ב C++.net לבין c++ למשל
 
למעלה