Tôi có một vĩ mô được sử dụng trên tất cả các mã của tôi rằng trong chế độ gỡ lỗi không:Làm cách nào để hướng dẫn tối ưu hóa GCC dựa trên các xác nhận mà không có chi phí thời gian chạy?
#define contract(condition) \
if (!(condition)) \
throw exception("a contract has been violated");
... nhưng trong chế độ phát hành:
#define contract(condition) \
if (!(condition)) \
__builtin_unreachable();
Điều này không hơn một assert()
là, trong phiên bản xây dựng, trình biên dịch có thể tối ưu hóa rất nhiều mã nhờ sự truyền bá UB.
Ví dụ, thử nghiệm với đoạn mã sau:
int foo(int i) {
contract(i == 1);
return i;
}
// ...
foo(0);
... ném một ngoại lệ trong chế độ gỡ lỗi, nhưng sản xuất lắp ráp cho một vô điều kiện return 1;
trong chế độ phát hành:
foo(int):
mov eax, 1
ret
Điều kiện và mọi thứ phụ thuộc vào nó, đã được tối ưu hóa.
Sự cố của tôi nảy sinh với các điều kiện phức tạp hơn. Khi trình biên dịch không thể chứng minh rằng điều kiện không có tác dụng phụ, nó không tối ưu hóa nó, đó là một hình phạt runtme so với việc không sử dụng hợp đồng.
Có cách nào để thể hiện rằng điều kiện trong hợp đồng không có tác dụng phụ, do đó, luôn là được tối ưu hóa?
Nhận xét không cho thảo luận mở rộng; cuộc hội thoại này đã được [chuyển sang trò chuyện] (http://chat.stackoverflow.com/rooms/144609/discussion-on-question-by-lyingonthesky-how-to-guide-gcc-optimizations-based-on). – deceze