C vs C++

guznik

New member
C vs C++

סתם עלתה במוחי תהיה תוך כדי שאני מקודד: מה היתרונות של C על פני C++ שגורמים לאנשים לכתוב מערכות גדולות ב-C? ברור שאם מדובר בדברים קטנים או במשחקים עם ביטים ודברים כאלה יכול להיות יתרון ל-C, אבל כשמדובר במערכות גדולות שלא מתעסקות עם הביפנוכו של המחשב, למה לא לנצל את הרעיון האדיר של OOP? מה פיספסתי?
 

Zack DA

New member
לעניות דעתי, לא פספסת.

אין ל- C שום יתרון נראה לעין על CPP שאני יכול לחשוב עליו כרגע... מי בדיוק כתב מערכת גדולה ב- C ולא ב- CPP ?
 

the another one

New member
את unix כתבו ב C

יכול להיות שעשו את זה בגלל התאימות לאחור של CPP ........
 

DecayCell

New member
היו דיונים בנושא

אנשים שהתנסו רבות בתחום הזו טוענים שבבניית מערכת הפעלה אי-אפשר להביא למימוש סביר של עקרונות OOP, ולכן ++C לא תיתן שום ייתרון, ורק תסרבל את העניינים.
 

DadleFish

New member
פשוט מאוד

אין שום יתרון אמיתי ל-C על פני ++C, אבל ++C כשפה רשמית וסטנדרטית קיימת רק 6 שנים, והבעיה האמיתית שלה היא שאם לא משתמשים בה נכון, אפשר לגרום להרבה OVERHEAD, מה שפוגע ב-PERFORMANCE. במילים אחרות, תוכניתן ++C לא מיומן יכול לכתוב קוד איטי מאוד ב-++C, ואולי ב-C הוא יכתוב קוד יותר מהיר. תוכניתן ++C מיומן יכול לכל הפחות לכתוב קוד שרץ באותה מהירות כמו קוד C. למעשה, מכיוון ש-++C מאפשרת TEMPLATES ובעיקר את ה-STL - בהרבה מקרים ++C תשפר את מהירות התוכנה - כל עוד כמובן יודעים איך לעשות את זה.
 

yar1v

New member
C++ מכילה את C

ובשבילי תמיד יש עדיפות לשלב OOP ופרוצדורלי. נהנים מ2 העולמות
 
אתה יכול להרחיב על TEMPLATES?

האם כוונתך היא שהשימוש ב TEMPLATES ישפר את מהירות כתיבת התוכנית או את מהירות הריצה של התוכנית? מהירות הכתיבה - זה ברור. אבל כיצד זה ישפר את מהירות הריצה?
 

vinney

Well-known member
מחזור קוד

קוד שמגיע בSTL כתוב יעיל, ובד"כ ללא באגים, בניגוד לקוד שיעשה אותו דבר ותכתוב אותו בעצמך. אם אתה מתכנת מצוין ובעל זמן לא מוגבל, יכול להיות שתכתוב מנגנונים כמו VECTOR, MAP, STREAM, וכו בלי STL, ושיעבדו מהר כמו הSTL, אבל לא נראה לי שזה יקרה.
 

DadleFish

New member
השיפור במהירות לא נובע מהשימוש

ב-templates, אלא מקיום ה-STL, שסביר להניח שהוא הרבה יותר מהיר מכל משהו שמישהו יכתוב בעצמו לבד.
 

Zack DA

New member
לא בדיוק.

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

DadleFish

New member
תקרא את ++efficient c.

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

Zack DA

New member
גם מימוש ג'נרי יכול להכיל טריקים

ברמה האלגוריתמית הטהורה, שיעזרו למקרה הממוצע אבל במקרים מסוימים לא יהיו אידאלים. האינך חושב כך ?
 

DadleFish

New member
כן, זה נכון למשל ל-QuickSort.

עדיין, אלו לא "טריקים" במובן שאני מתכוון אליו. למשל, אם אתה יודע שהמערך שלך מכיל אך ורק מספרים מ-1 עד 100, אתה יכול למיין אותו עם BUCKET SORT ב-(O(N. זה "טריק", לצורך העניין, כי הוא לא פועל גנרית.
 

Zack DA

New member
כן. אבל אתה מפספס אותי ../images/Emo13.gif

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

vinney

Well-known member
זה לא כזה ג'נרי

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

Zack DA

New member
הערות:

1. לא ממש משפיע ? ואם אני מוסיף כל הזמן איברים למבנה ? יכול להיות שבשבילי זה קריטי. הפעולה הזאת פוגעת בביצועים ? 2. אתה נטפל לדוגמא ספציפית שמעצם היותה דוגמא, היא רק באה להעביר פואנטה. אני מודה שכדוגמה בחרתי במשהו די לא משכנע.
 

vinney

Well-known member
זה כל הרעיון בג'נריות ../images/Emo13.gif

דוגמא ספציפית לא יכולה להיות למשהו ג'נרי, ומשהו ג'נרי לא יכול לתת מענה ספציפי. שים לב, שגם בדוגמא שלך, הסיבוכיות שנוספת היא O של 1, בכל קנה מידה, ולכן זניחה יחסית לפעולת ההוספה עצמה, שהיא נעה בין O של 1 ל NLOGN, תלוי במבנה. לעניין הדיון המהותי, STL נותן הגדרות ספציפיות לגבי סיבוכיות זמן ריצה / זכרון של כל אחד מהמבנים, ובמסגרת הסיבוכיות שמוגדרת, הוויכוח יכול להיות אולי על מקדמים, שכמו שאתה יודע, רוב הפעמים זניחים. במקרים בהם הם לא זניחים - צריך לדון ולשקול, ורוב הסיכויים ששיפור יחסית לSTL יתבסס רק על וויתור על הג'נריות, כמו בדוגמא שלך וכמו בדוגמא של אלדד.
 
למעלה