ใด ๆ ที่คุ้มค่าคอมไพเลอร์ของเกลือจะสร้างตรงลำดับเครื่องภาษาเดียวกันสำหรับโครงสร้างทั้งสำหรับการใด ๆ ในตัวชนิด ( int
, float
ฯลฯ ) ตราบใดที่คำสั่งมันเป็นง่ายๆเป็นและการเพิ่มประสิทธิภาพถูกเปิดใช้งานx = x + a;
(โดยเฉพาะอย่างยิ่ง GCC -O0
ซึ่งเป็นโหมดเริ่มต้นจะทำการป้องกันการเพิ่มประสิทธิภาพเช่นการแทรกร้านค้าที่ไม่จำเป็นทั้งหมดลงในหน่วยความจำเพื่อให้แน่ใจว่าผู้ดีบั๊กสามารถค้นหาค่าตัวแปรได้ตลอดเวลา)
หากคำสั่งมีความซับซ้อนมากขึ้นอาจแตกต่างกัน สมมติว่าf
เป็นฟังก์ชันที่ส่งกลับตัวชี้แล้ว
*f() += a;
โทรf
เพียงครั้งเดียวในขณะที่
*f() = *f() + a;
เรียกมันสองครั้ง หากf
มีผลข้างเคียงหนึ่งในสองข้อจะผิด (อาจเป็นอย่างหลัง) แม้ว่าf
จะไม่มีผลข้างเคียง แต่คอมไพเลอร์อาจไม่สามารถกำจัดการเรียกครั้งที่สองได้ดังนั้นการเรียกครั้งหลังอาจช้าลง
และเนื่องจากเรากำลังพูดถึง C ++ ที่นี่สถานการณ์จึงแตกต่างกันอย่างสิ้นเชิงสำหรับประเภทคลาสที่โอเวอร์โหลดoperator+
และoperator+=
. หากx
เป็นประเภทดังกล่าว - ก่อนการปรับให้เหมาะสม - x += a
แปลเป็น
x.operator+=(a);
ในขณะที่x = x + a
แปลเป็น
auto TEMP(x.operator+(a));
x.operator=(TEMP);
ตอนนี้ถ้าคลาสได้รับการเขียนอย่างถูกต้องและเครื่องมือเพิ่มประสิทธิภาพของคอมไพเลอร์ดีพอทั้งคู่จะสร้างภาษาเครื่องเดียวกัน แต่ก็ไม่แน่ใจเหมือนกันสำหรับประเภทในตัว นี่อาจจะเป็นสิ่งที่ Stroustrup +=
เป็นความคิดของเขาเมื่อเขาส่งเสริมการใช้