OOP ב-++C

זה לא מדוייק מה שאת אומרת...

מפאת הסיבה שלפעמים אנו צריכים להפעיל את ה Garbage Collector והוא איננו מופעל עצמאית!
 

yair24

Member
כאן אני חושב שאת טועה.

אני נהנה לשבור את הראש על ניקוי זיכרון. זה מלמד הרבה יותר טוב מאשר ג´אווה שפותרת את כל הבעיות בצורה אוטומטית. יאיר
 

voguemaster

New member
כן, זה נחמד, אבל

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

voguemaster

New member
אלדדי אתה לא צודק

שליטה זה יפה וטוב, אבל לפעמים היא פועלת לרעתך. אני מצטער מאוד, אבל ישנם דברים שאפשר לעשות כשנותנים לאוטומציה לשלוט, במקרה זה אנחנו מדברים על ניהול זיכרון. מה לעשות, יש דברים שאפשר לעשות בג´אווה בגלל שיש COLLECTOR ואי אפשר לעשות ב-C. יותר נכון, כן אפשר לעשות ב-C, אבל לא חכם לעשות ב-C! אלי
 

אלדד26

New member
דוגמאות, בבקשה.

אם אתה ממש רוצה GC ב - ++C, אתה יכול לשנות את new ואת delete, אם ברמה הגלובלית ואם בספציפית. לא חכם? הסבר, נמק, פרט והדגם. אגב, מה שאתה *לא* יכול לעשות ב - JAVA זה להכתיב לקומפיילר (או למעשה ל - JVM) איך להקצות זיכרון. למשל, אם יש לך תוכנית שצריכה "להקצות" ו-"לשחרר" אובייקטים מתוך POOL שגודלו ידוע מראש, אתה יכול לעשות את זה באלגנטיות מושלמת על ידי העמסת new ו - delete, תוך שאתה מקצה מראש את כל השטח הנדרש - ואז "מקצה/משחרר" על ידי נתינת המשאב הנחוץ. שליטה לעולם לא פועלת לרעתך. אתה פועל לרעתך כשאתה לא יודע מה אתה עושה וכותב קוד דפוק. תוכניתן ++C ראוי לשמו (ואני מסכים שאין הרבה כאלו) לא ייכשל בשימוש בכלים האינסופיים שהשפה הזו נותנת לו. JAVA, לעומת זאת, מוגבלת - נקודה. אז אוקיי, אם אתה רוצה לכתוב יישומים ש - JAVA מתאימה להם (קרי, לא יישומים תובעניים מבחינת זכרון, זמן ריצה וכו´) - סבבה. אם יש לך מחשב עם המווווון זיכרון, שרץ מאוווווווווד מהר, ואתה מתעקש לכתוב SERVER עבורו ב - JAVA - אז שיהיה לך לבריאות
בדבר אחד אני מסכים - ב-JAVA כותבים יותר מהר קוד יותר יציב (רק חבל שהוא לא משהו, הקוד הזה). את זה אפשר, אגב, לעשות גם ב - VISUAL BASIC. הנה, בחודשים האחרונים יצא לי לכתוב פרויקט ענקי ב - VB. אין לי מושג ירוק מהשפה הזו. דוגרי, אין לי מושג מה אני עושה שם. הכל ניסוי וטעייה. אבל מה, יצא לי פרויקט! עם חלונות, עם WEB, עם קישור ל-DB - וואלה, פשוט נהדר. מ-צ-ו-י-ן. ב - ++C הייתי שובר שיניים על זה. עכשיו לך תכתוב, למשל, Software encoder ל - MPEG-4 ב - VB. תעיר אותי כשהוא יסיים את הפריים הראשון. לילה טוב!
 

voguemaster

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

אני לא יודע לגבי הקצאת זיכרון ושליטה חכמה יותר על זה, כי לא חקרתי לעומק אבל בוא רק נגיד שכמעט אף פעם לא צריך... בקשר לדוגמא, חופשי, אני אתן לך אחת מניסיוני האישי. תאר לך שאתה מקבל מ-Stream מסוים מספר שורות בפורמט מסוים (אורך לא קבוע אבל מבנה לקסיגרפי זהה), ובכמות לא ידועה. אתה רוצה להיות מסוגל לקרוא את המידע ולהחזיר מערך של שורות כאלו (למען הפשטות, כל שורה תהיה מחרוזת) בתוך פונקציה ולהחזיר את המערך לפונקציה שקראה לה. יותר מכך, אם תרצה לבצע מניפולציה של אותו מערך (כגון שינוי אחת המחרוזות או מחיקה שלהן) תוכל לבצע את זה בפונקציה אחרת. בג´אווה כתבתי את הפונקציה שקוראת את השורות ומחזירה מערך ב-20 שורות (כולל הערות!
). ב C או CPP אני רואה כמה בעיות: 1. אתה מנהל את הזיכרון לבד, לכן לא יהיה חכם מצידך שפונקציה תקצה זיכרון דינמית בתוכה, ועוד כמות לא ידועה. לתוכנית חייבת להיות דרך לדעת כמה זיכרון הוקצה במדויק. בד"כ אתה מעביר מבנה נתונים כלשהו או BUFFER עם גודל ידוע ולתוכו קורא את המידע, או לחלופין מוצא פיתרון מעיק אחר לשחרור הזיכרון אח"כ, כמובן תוך כדי מציאת דרך ליידע את שאר התוכנית על כמות הזיכרון שהעניין תפס. 2. להעביר את אותו מערך לפונקציה אחרת לשם מניפולציה (בין אם החלפת מחרוזת או מחיקה, או לא משנה..). בג´אווה אתה יכול להשוות איבר מהמערך ל-NULL או להקצות חדש במקומו וה-REFERNCE לאוביקט הישן יהיה מועמד לניקוי אוטומטי. ב-CPP תיאלץ לבצע את הניקיון בעצמך. מעבר לכך, אם אתה עובד עם מערך של מצביעים ל-CHAR שמצביעים ל-BUFFER גדול שמכיל בתוכו הרבה מחרוזות, אין לך אפשרות לשנות. אם הקצאת כל מחרוזת אתה כמובן יכול למחוק אותה ולהקצות חדשה. הבדל קל בקלות השימוש. זה עלול להפוך להרבה יותר מסובך כשאתה לא מטפל רק במחרוזת אחת מתוך המערך אלא ביותר. 3. יש עוד כמה יתרונות מעניינים לניהול זבל אוטומטי
. קח לדוגמא אפשרות של יצירת אובייקטים זמניים לביצוע פעולות, תוך כדי כך שאתה לא צריך לדאוג למה קורה איתם אח"כ. הדוגמא הכי טריוויאלית היא לקחת מחרוזת ולפצל אותה החל מתו מסוים (אם נמצא). סלח לי, אבל זה לוקח לי 2 שורות בג´אווה, במקרה הרע....
אני לא רוצה בכלל לדבר על לעשות את זה ב-C כי זה מעצבן אפילו עוד יותר! תוסיף לזה עוד פעולות ואתה מקבל כאב ראש. בקיצור, החיים עם שימוש באוסף הזבל האוטומטי הזה הרבה יותר קלים למתכנת. יותר קל לבצע דברים בהקשר של זיכרון, כלומר, לא צריך למעשה לנהל זיכרון אלא רק להתשמש באובייקטי המידע שתכנתת. הרבה יותר פקודיקטיבי ומוליד הרבה פחות באגים, בזה לפחות אתה מסכים איתי. אני לא רוצה לספר לך איך נראית אותה השגרה כשכתבתי אותה ב-C, זוועה! והיא אפילו לא תומכת במספר לא ידוע של מחרוזות. השתמשתי בשיטת ה-BUFFER הגדול ולתוכו מערך של מצביעים לטובת יציבות השרת שכתבתי. בכל מקרה, קוד שכתבתי בג´אווה דרש ממני הרבה הרבה פחות דיבוג מאשר ב-C או CPP, ורק לסבר לך את האוזן, אני לא רוצה להתרברב אבל אני מעולה במציאת באגים. בכל זאת נהניתי מהעובדה שלא בזבזתי יותר מ-5 דקות על איזשהו באג...
אלי נ.ב. בקשר ל-VB, אל תתחיל! אני שונא את השפה המפגרת הזאת. ד"א, באותה קלות אפשר לכתוב דברים בג´אווה וכמעט באותה קלות אפשר לכתוב דברים עם ה-WIZARD של VCPP ו-MFC.
 

חובבן

New member
++C היא שפה פתוחה מאד

שמאפשרת שיטות עבודה שונות (ומשונות) וכך תוכננה. לגבי ההתיחסות לזיכרון, רב הבעיות שאתה (את?) מתאר פה נפתרות בקלות ע"י שימוש מושכל ב auto_ptr. למעשה אני משתדל לא להשתמש ב new בלעדיו. פתרונות מתוחכמים יותר (smart pointers) ניתן למצוא באתר של Boost. בקשר ל *char, שימושים בסגנון שאתה מתאר פה עדיך לעשות עם ה class string. Java תוכננה כשפה סגורה יותר עם פחות חופש למתכנת. היתרון הוא חיסכון גדול ב bugs, החסרון, כאמור, פחות חופש. גם ב ++C ניתן לעבוד בצורה נכונה ובכך לחסוף את רב ה bugs, אבל בניגוד לJavaת זאת אחריות של התכנת.
 

אלדד26

New member
כמה דברים -

לא סתרת את מה שאמרתי, אלי. מכיוון שאין לי חשק להתחיל להעביר כאן קורס על הקצאות ושחרורי זיכרון, אומר רק שנתקלתי בכל אותן בעיות שאתה מדבר עליהן, ותמיד מצאתי פתרונות אלגנטיים. אגב, כמעט תמיד הסוד הוא להשתמש באובייקטים בצורה חכמה - וזה לא אומר בהכרח, אגב, להעמיס new ו - delete. זה אומר לבנות אובייקטים בצורה שתחליף לך את הפונקציות באופן אלגנטי יותר; שתטפל בהקצאה ובשחרור באופן עצמאי, מבלי שהמשתמש יצטרך לדאוג לזה. לעומת זאת, בוא וניקח את הסיטואציה הבאה. יש לך פעילות מסוימת לעשות. הפעילות היא איטרטיבית וחוזרת על עצמה עד שהמשתמש מחליט לעצור. הפעילות עצמה צריכה לקחת לא יותר משניה אחת. כתבת את מה שהפעילות אמורה לעשות. נניח לרגע ש - JAVA ו - ++C נותנים את אותם הביצועים. הגעת לשניה וחצי. התחלת לעשות tweaking ואופטימיזציות (בוא נניח שלא הגעת לשלב תרגום הקוד לאסמבלי). הצלחת להביא את הפעילות ל - 900ms. (גם ב - JAVA, גם ב - ++C). נהדר. אתה מריץ את התוכנה. עובד מצוין. חבר שלך, חסיד JAVA, יושב בצד, מתמוגג כולו מהביצועים, שהרי את קוד ה - JAVA כתבת בחצי מהזמן, והוא בטוח נראה הרבה יותר אלגנטי. החבר השני שלך, חסיד ה - ++C, יושב בצד ואוכל את הכובע. ואז פתאום גרסת ה - JAVA קורסת! בדיקה מהירה מגלה שלפתע פתאום, באחת האיטרציות, זמן הפעילות עלה מ - 900ms ל - 1500ms. מה קרה? בדיקה מהירה נוספת מגלה שבדיוק באותה פעילות, ה - JVM החליט שהוא קצת IDLE, והריץ לך GC. הלכה התוכנית. הבעיה המרכזית עם JVM, ועם כל אינטרפרטר או חצי-אינטרפרטר היא השליטה. כמו שאמרתי בהתחלה, אי אפשר לצפות מה הדבר הזה יעשה. נכון, גם קוד ++C מושפע מגורמים חיצוניים דוגמת חלזונות (אהבתי
) - אבל זה כבר נתון חיצוני שגם אותו אפשר לנטרל, אם משתמשים ב - VxWorks, למשל. לסיכום - נכון. רוב האפליקציות הן בלתי תובעניות בעליל. מחשבים הולכים ונהיים יותר חזקים, וממילא בין שתי השפות יש שקילות פולינומיאלית, שלא הורסת לאף אחת מהן את יכולת החישוב. שתיהן שפות נחמדות וטובות. אבל עדיין, לא כל דבר שאפשר לעשות ב - JAVA אפשר לעשות ב - ++C, וההיפך כן. נכון, לא מהבחינה התיאורטית-אלגוריתמית, אלא מהבחינה הפרקטית. אבל כל עוד אנחנו מהנדסי תוכנה גאים ולא בעלי דוקטורט במדעי המחשב, מותר לנו להישאר בפרקטיקה
 

אלדד26

New member
דוגמאות, בבקשה.

אם אתה ממש רוצה GC ב - ++C, אתה יכול לשנות את new ואת delete, אם ברמה הגלובלית ואם בספציפית. לא חכם? הסבר, נמק, פרט והדגם. אגב, מה שאתה *לא* יכול לעשות ב - JAVA זה להכתיב לקומפיילר (או למעשה ל - JVM) איך להקצות זיכרון. למשל, אם יש לך תוכנית שצריכה "להקצות" ו-"לשחרר" אובייקטים מתוך POOL שגודלו ידוע מראש, אתה יכול לעשות את זה באלגנטיות מושלמת על ידי העמסת new ו - delete, תוך שאתה מקצה מראש את כל השטח הנדרש - ואז "מקצה/משחרר" על ידי נתינת המשאב הנחוץ. שליטה לעולם לא פועלת לרעתך. אתה פועל לרעתך כשאתה לא יודע מה אתה עושה וכותב קוד דפוק. תוכניתן ++C ראוי לשמו (ואני מסכים שאין הרבה כאלו) לא ייכשל בשימוש בכלים האינסופיים שהשפה הזו נותנת לו. JAVA, לעומת זאת, מוגבלת - נקודה. אז אוקיי, אם אתה רוצה לכתוב יישומים ש - JAVA מתאימה להם (קרי, לא יישומים תובעניים מבחינת זכרון, זמן ריצה וכו´) - סבבה. אם יש לך מחשב עם המווווון זיכרון, שרץ מאוווווווווד מהר, ואתה מתעקש לכתוב SERVER עבורו ב - JAVA - אז שיהיה לך לבריאות
בדבר אחד אני מסכים - ב-JAVA כותבים יותר מהר קוד יותר יציב (רק חבל שהוא לא משהו, הקוד הזה). את זה אפשר, אגב, לעשות גם ב - VISUAL BASIC. הנה, בחודשים האחרונים יצא לי לכתוב פרויקט ענקי ב - VB. אין לי מושג ירוק מהשפה הזו. דוגרי, אין לי מושג מה אני עושה שם. הכל ניסוי וטעייה. אבל מה, יצא לי פרויקט! עם חלונות, עם WEB, עם קישור ל-DB - וואלה, פשוט נהדר. מ-צ-ו-י-ן. ב - ++C הייתי שובר שיניים על זה. עכשיו לך תכתוב, למשל, Software encoder ל - MPEG-4 ב - VB. תעיר אותי כשהוא יסיים את הפריים הראשון. לילה טוב!
 
למעלה