Bất kỳ trình biên dịch trị giá muối của nó sẽ tạo ra một cách chính xác các chuỗi ngôn ngữ máy tương tự cho cả hai cấu trúc đối với bất kỳ built-in loại ( int
, float
, vv) miễn là báo cáo kết quả thực sự là đơn giản như x = x + a;
và tối ưu hóa được kích hoạt . (Đáng chú ý, GCC's -O0
, là chế độ mặc định, thực hiện chống tối ưu hóa , chẳng hạn như chèn các kho lưu trữ hoàn toàn không cần thiết vào bộ nhớ, để đảm bảo rằng trình gỡ lỗi luôn có thể tìm thấy các giá trị thay đổi.)
Tuy nhiên, nếu câu lệnh phức tạp hơn, chúng có thể khác nhau. Giả sử f
là một hàm trả về một con trỏ, thì
*f() += a;
f
chỉ gọi một lần, trong khi
*f() = *f() + a;
gọi nó hai lần. Nếu f
có tác dụng phụ, một trong hai sẽ sai (có thể là sau này). Ngay cả khi f
không có tác dụng phụ, trình biên dịch có thể không loại bỏ được cuộc gọi thứ hai, vì vậy cuộc gọi thứ hai thực sự có thể chậm hơn.
Và vì chúng ta đang nói về C ++ ở đây, tình hình hoàn toàn khác đối với các loại lớp quá tải operator+
và operator+=
. Nếu x
là một loại như vậy, thì - trước khi tối ưu hóa - x += a
dịch thành
x.operator+=(a);
trong khi x = x + a
dịch sang
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Bây giờ, nếu lớp được viết đúng cách và trình tối ưu hóa của trình biên dịch đủ tốt, cả hai sẽ kết thúc việc tạo ra cùng một ngôn ngữ máy, nhưng điều đó không chắc chắn như đối với các loại tích hợp sẵn. Đây có lẽ là những gì Stroustrup nghĩ đến khi ông khuyến khích sử dụng +=
.