1.1 - סביבת עבודה ומודל ביצוע - תרגול
תרגול - מקור אחד ושתי תצורות בנייה¶
בתרגיל נבדוק אם שינוי בפלט נובע מחוזה השפה, מיעד הבנייה או מהקוד שכתבנו. מגישים את קובצי המקור, את פקודות הבנייה ואת ההסבר; צילום מסך לבדו אינו מספיק כדי לשחזר ניסוי.
שינוי דרך reference¶
כתבו תוכנית עם שתי פונקציות בשם by_value ו־by_reference. כל פונקציה מקבלת מספר שלם ומגדילה אותו, אבל רק השנייה מקבלת reference. התחילו במונה שערכו עשר, קראו לשתי הפונקציות והדפיסו את המונה אחרי כל קריאה.
לפני הרצה כתבו מה צריך להיות מודפס ומי האובייקט שמשתנה בכל פונקציה. הוסיפו פונקציה שמקבלת const int& ונסו לשנות את הפרמטר שלה. שמרו את הודעת המהדר, ואז הסירו את השינוי האסור כדי לחזור לתוכנית תקינה.
בדיקת היעד¶
הדפיסו את sizeof(int), את sizeof(long) ואת sizeof(void*). הוסיפו בדיקת קומפילציה שמחייבת מצביע בן שמונה bytes, ובנו בסביבת x64.
אם קיימים במחשב גם כלים ל־x86, בנו את אותו מקור ליעד הזה ונתחו את הכישלון הצפוי של הבדיקה. אם הכלים חסרים, כתבו מה הייתם מצפים שייכשל ומה עדיין לא אומת; אין צורך להתקין סביבת יעד נוספת לצורך התרגיל.
קריאה שנעלמה¶
בנו עם /Od ועם /O2, והפיקו אסמבלי לגרסה הממוטבת. חפשו את הקריאה לפונקציה שמגדילה את המונה. הסבירו מדוע היעדר קריאה מפורשת אינו אומר שהמהדר התעלם מהפעולה.
החליפו את הערך ההתחלתי בערך שמתקבל ממשתמש באמצעות std::scanf, עם בדיקת ערך החזרה. בדקו מה השתנה באסמבלי ומה נשאר זהה בחוזה התוכנית.
שאלות למסירה¶
הסבירו מדוע גודל של מצביע אינו מלמד מה גודלו של long. הסבירו גם למה reference קבוע אינו הופך אובייקט לבטוח לשימוש מקבילי, ולמה התנהגות תקינה בהרצה אחת אינה מספיקה להוכחת ניידות בין מערכות.