Khi cùng một đoạn mã được biên dịch với tối ưu hóa hoàn toàn vô hiệu hóa (g++ -O0
) và sau đó một lần nữa với tối ưu hóa được kích hoạt đầy đủ (g++ -O3
), làm thế nào có thể logic của chính mã nguồn được thay đổi?Làm thế nào tối ưu hóa trình biên dịch có thể ảnh hưởng đến logic mã?
Ví dụ, trình biên dịch có thể
- unwind loops và
- làm constant folding.
Hai tối ưu hóa này làm cho mã hoạt động nhanh hơn mà không ảnh hưởng đến tính toàn vẹn của mã nguồn ban đầu. Bất kỳ mã nào chạy mà không có các tối ưu hóa này sẽ chạy với chúng được bật.
Nhưng tối ưu hóa trình biên dịch cũng có thể ảnh hưởng đến logic mã. Dưới đây là hai ví dụ mà tôi biết:
- Removing copy constructors and assignment operators từ thời gian có thể loại bỏ các tác dụng phụ có thể xảy ra.
- Sắp xếp lại số học có chứa các giá trị dấu phẩy động có thể ảnh hưởng đến lỗi dấu phẩy động (hy vọng yêu cầu đối số
-ffast-math
).
Tôi đã rất ngạc nhiên, và may mắn, để tìm hiểu về những điều này bởi vì chúng có thể trở thành tiềm năng rất lớn trong tình huống sai.
Vì vậy, tôi muốn biết, có bất kỳ trường hợp nào khác mà tối ưu hóa trình biên dịch C++ sẽ ảnh hưởng đến mã logic không? Tôi đang tìm kiếm thông tin cụ thể về C++ 11 (không có bất kỳ hành vi không xác định nào) theo trình biên dịch g ++, nhưng lời khuyên cho các trình biên dịch khác được chào đón.
Đừng quên đề cập đến hành vi không xác định đó sẽ có nghĩa là mọi thứ xảy ra. – Mysticial
Tôi tin rằng trình biên dịch cũng có thể 'không tính toán' công cụ mà không bao giờ được sử dụng sau này. Mặc dù điều này không thay đổi logic của mã của bạn, nhưng điều đó có thể không tốt nếu bạn đang đo lường hiệu suất. Tôi không chắc chắn về điều này mặc dù. – leo
@leo Điểm tốt! Mặc dù, tôi luôn mong đợi việc biên dịch với tối ưu hóa sẽ hoạt động nhanh hơn, bởi vì đó là công việc của trình tối ưu hóa. – Ryan