הקומפיילר לא "ממליץ".
האופטימיזציות שהקומפיילר מבצע הן ברמת assembly לא ברמת שפת C.
והן תלויות בדגלי קומפילציה שסיפקת.
 
למשל, אם אתה מקמפל בתצורת Debug, שהיא ברירת מחדל של VS, הקומפיילר לא יבצע שום אופטימיזציות (עד כמה שאני זוכר, אולי MS שינו את זה בגרסאות חדשות יותר).
 
אני יודע שעבור gcc, יש דגל שיכול לבקש מהקומפיילר לבצע קומפילציה בלבד - תרגום C לאסמבלי, שזה השלב השני בבניית תוכנה ב-C.
אז, אתה יכול להשוות תרגום עם אופטימיזציות ובלי, ולראות מה הקומפיילר עשה.
 
אגב, מה שהרבה פעמים מכנים "קומפילציה", עבור שפת C למעשה כוללת 4 שלבים:
1. Preprocessor שמתרגם את כל ה-define וה-include ושאר הדברים עם # לקוד C ממש. (בד"כ עושה copy / paste)
 
2. קומפילציה - זה השלב המסובך ביותר של להפוך קוד C, לאוסף פקודות מכונה בייצוג אסמבלי. זה השלב בו לקומפיילר יש "שיקול דעת" וההחלטה כיצד לתרגם משפט מסוים ב-C יכולה להשפיע על יעילות.
 
למשל, קומפיילר יכול לבחור "לפרוס" לולאה - כלומר ליצור ממש חזרות בקוד במקום קפיצות למקום אחר בקוד, מה שיתבצע בצורה יעילה יותר על המעבד.
 
3. אסמבלי (הרכבה) כאן התוצר של שלב 2 הופך ממש לקוד מכונה עבור מעבד ספציפי ונארז בקובץ בפורמט ספציפי (obj במקרה של VS).
 
4. קישור (linkage) כאן, המקשר linker מחבר את הקוד שלך לכל שאר הדברים שהוא צריך כדי לרוץ, למשל לספרייה הסטנדרטית של C שכוללת דברים כמו printf שהתוכנה שלך משתמשת בהם.
 
רק לאחר כל 4 שלבים נוצר קובץ התוכנה הסופי, למשל EXE.