לחובבן על חריגות ו-RTTI

annefan

New member
לחובבן על חריגות ו-RTTI

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

DadleFish

New member
מה הקשר בין פולימורפיזם לבין RTTI?

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

vinney

Well-known member
מימוש פולימורפיזם

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

annefan

New member
שוב אותו ויכוח ישן

קודם כל בואו נפריד בין הגדרות למימוש. VTBL זה המימוש הנפוץ, אולי היחיד , לפונקציות וירטואליות. אם יבוא מממש קומפיילרים, וימצא דרך יעילה יותר למימוש פולימורפיזם (לדוגמא ע"י type_info וכד'), זכותו, העיקר שאם מתכנת יכתוב פונקציה וירטאולית, ויפנה לאוביקט דרך מצביע לאב, תופעל הפונקציה המתאימה. בודאי ובודאי לגבי איך שויני מתאר את המימוש של פולימורפיזם. בספר "Inside the C++ Object Model" מתוארים כל מיני שלבים של המימוש, שבחלקם היו, ובחלקם עד היום ממומשים רק בזמן ריצה, מה לעשות. לגבי חריגות, מה שהתחיל את הדיון, יכול להיות שיש מימושים שדורשים RTTI מלא, יש כאלה שעושים את זה מאחרוי הגב שלך, ויש כאלה שלו.
 

DadleFish

New member
אני לא מבין על מה אתה מדבר

עזוב אותך מהמימוש הקיים. למה שתרצה TYPE_INFO בשביל פולי? תן לי סיבה אחת טובה. אולי אני לא יודע על מה אני מדבר, אבל אני לא מבין למה זה טוב. יש סטנדרט. יש דרישות. מן הסתם, ברור שעדיף לעשות דברים בזמן קומפילציה ולא בזמן ריצה - אני לא חושב שאפשר להתווכח על זה - ולכן, אם יש דרך ליישם FEATURE X בזמן קומפילציה, זה עדיף על זמן ריצה. פולימורפיזם הוא אחד הדברים האלו. אז נכון, אתה יכול להכין טבלה שממפה TYPE לפונקציות בצד, ואז בזמן ריצה להגיע דרך הטבלה לפונקציה הנ"ל. מצד שני, אתה יכול גם לכתוב ב-JAVA, למה להתאמץ?
 

annefan

New member
גם בירושה מרובה?

גם בירושה וירטואלית? תקרא בספר הנ"ל על הבעיות כמות הפינות ב++C היא עצומה. מה שהצליחו לממש בזמן קומפילציה (ולינק, יש דברים שממומשים רק שם), נהדר. אבל, פולימורפיזם, הוא (או היה) הסוג הבסיסי של RTTI. היום הוא ממומש ב-VTBL, פעם הוא מומש בזמן ריצה. אם צריך לחשוב על מכונה, שהיא מאוד מהירה, אבל מוגבלת מאוד בזכרון, יתכן מאוד שיהיה כדאי לממש פולי ב-RTTI. בכל מקרה, השאלה המקורית היתה על היחס בין exceptions לבין RTTI, מה שמגדיר עוד רמה של RTTI, משהו בין כלום ל-RTTI המלא.
 

DadleFish

New member
גם את הקשר בין EXCEPTIONS

לבין RTTI אני לא מבין. RTTI הוא טוב ל-DOWNCASTING. אני לא רואה שום סיבה טובה אחרת לשימוש ב-RTTI.
 

חובבן

New member
אז אני אסביר (את דעתי)

שאני מתייחס ל RTTI אני מתייחס לזיהוי טיפוסים בזמן ריצה, טיפוסים שלא בהכרח יורשים מאותו class. לכן downcast ופונקציות וירטואליות לא קשורים לכאן. מה ש RTTI נותן זה typeof. למה (לפי ההגדרה הזאת) זה קשור ל exception? כי ב catch הקומפיילר צריך לזהות את הטיפוס של ה class שנזרק. מכיוון שלא כל ה class שנזרקים יורשים מאותו superclass, הקומפיילר חייב להפעיל, פנימית RTTI. לכן כדי לממש exception צריך לשמור על כל class עוד מידע, שיכול לשמש גם ל typeof.
 

annefan

New member
נמחקה לי ההודעה

אבל חסכת לי כי כתבת את רוב מה שרציתי לכתוב.
 

DadleFish

New member
אני לא מבין איפה פה הטיעון -

עובדתית קומפיילרים מיישמים EXCEPTIONS בלי RTTI. איך? שאלה טובה. אבל עובדה שהם עושים את זה בלי RTTI.
 

selalerer

New member
יש הבדל בין RTTI מלא לרק לשמור סוג

טיפוס בעת זריקה. ב RTTI אתה שומר ביחד עם כל אובייקט שאתה יוצר את הסוג שלו, זה אומר שכל אובייקט שאתה יוצר בתוכנית לוקח יותר זכרון. בשביל exceptions לעומת זאת, מספיק רק שבכל קריאה לthrow אחד הפרמטרים הוא הטיפוס ואז הcatch הנכון מופעל, זה בסך הכל אומר קצת יותר שימוש במחסנית בקריאה לcatch הרבה, הרבה פחות תקורה.
 

annefan

New member
למה הגענו?

לויכוח סמנטי, מה זה RTTI בהגדרת השפה, לעומת מה זה RTTI בקומפיילרים השונים.
 

selalerer

New member
העניין הוא שאין צורך בRTTI בשביל

exceptions אפילו שמתבצעת איזשהי שמירה של סוג האובייקט, השמירה היא לטווח קצר ולא בכל אובייקט שנוצר, הרבה יותר חסכוני.
 

annefan

New member
פעם אחרונה ודי

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

selalerer

New member
../images/Emo45.gif לזה אני מסכים ../images/Emo13.gif

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