Nói rằng tôi có đoạn mã này:Trình biên dịch có tự động tối ưu hóa các cuộc gọi lặp lại tới các hàm toán học không?
#include <cmath>
// ...
float f = rand();
std::cout << sin(f) << " " << sin(f);
Như sin(f)
là một chức năng được xác định rõ có một tối ưu hóa dễ dàng:
float f = rand();
float sin_f = sin(f);
std::cout << sin_f << " " << sin_f;
này một tối ưu hóa mà đó là hợp lý để mong đợi một hiện đại, C là ++ biên dịch tự làm gì? Hoặc không có cách nào để trình biên dịch xác định rằng sin(f)
phải luôn trả lại cùng một giá trị cho một giá trị bằng nhau của f
?
Trừ khi 'sin' được định nghĩa trong cùng một đơn vị biên dịch, trình biên dịch không biết cách' sin' được triển khai, vì vậy tốt nhất điều này sẽ xảy ra tại thời gian liên kết. – Thomas
@Thomas Không nhất thiết. Một số trình biên dịch xử lý các chức năng của một số tên đặc biệt bởi vì chúng biết chúng được định nghĩa trong thư viện chuẩn, và tiêu chuẩn bảo đảm một cái gì đó về chúng. Ngoài ra còn có các thuộc tính chức năng của trình biên dịch cụ thể mà các tiêu đề do người dùng định nghĩa có thể sử dụng để khai báo chúng một cách thuần túy, mặc dù tôi không biết liệu kiến thức này có được sử dụng để tối ưu hóa hay không. – delnan
Việc tối ưu hóa thực sự được thực hiện với gcc. –