2.3.1.1. סמנטיקת ערכים מול סמנטיקת התייחסויות

כפי שציינו – אובייקט יכול להכיל אובייקט אחר. נשים לב כי ישנן שתי דרכים לייצוג ערכים מסוג אובייקט: על ידי value או על ידי משתנה התייחסות/מצביע.

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

סמנטיקת התייחסויות (RS): האובייקט יכיל התייחסות אל אובייקטים אחרים. האובייקט לא מכיל את האובייקטים עצמם בתוכו. דוגמאות: כל האובייקטים הלא אטומיים בשפת Smalltalk, מצביעים ומשתני התייחסות בשפת C++. האובייקט עצמו אינו מוכל, אלא שדה המאפשר לגשת אל האובייקט המוכל – מצביע אליו.

השוואה בין הגישות:

גישה לאובייקט:

על ידי VS מהירה יותר.

השוואת אובייקטים והעתקת אובייקט:

RS מהיר יותר.

בעלות על אובייקט אחר:

לא מוגדר ב-RS.

שיתוף של אובייקט:

קשה ב-VS.

ניהול זכרון אוטומטי:

קל יותר למימוש ב-RS.

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

חסרונות של שימוש במשתני התייחסות:

  • גישה לא ישירה אל האובייקט: יותר פקודות בשפת מכונה נדרשות בכל פעם שניגשים לערך.
  • ניהול זיכרון: המתכנת צריך להתעסק יותר בניהול הזיכרון (במערכות בהן אין ניהול זיכרון אוטומטי).
  • Dynamic binding overhead: סוג האובייקט ידוע לרוב רק בזמן ריצה, ולכן המהדר יכול פחות לבצע אופטימיזציות בזמן קומפילציה.


מאת: ניצן

Borland style vptr

לפי מה שאני מכיר:
"חסרון בגישה זו: גם כאשר איננו משתמשים ב-dynamic binding – אנחנו משלמים במקום"
לא נכון , עבור מחלקה A שאין לה מתודות דינמיות לא יווצר כלל המצביע, ולמשל עבור מחלקה B שיורשת מA פשוט נוסיף בהתחלה את המצביע, ואחרי הבלוק של A את שאר האינפורמציה של B . וככה לא משלמים על מה שלא משתמשים ועקרונות C++ נשמרים.
מה שכן באמת הcasting קצת יותר מסובך....
שיתוף:
| עוד