Mã thử nghiệm sau đây thực hiện chính xác trong VS hoặc với gỡ lỗi hoặc phát hành, và cũng trong GCC. Nó cũng làm đúng cho ICC với gỡ lỗi, nhưng không phải khi tối ưu hóa được kích hoạt (-O2
).Trình biên dịch có được phép loại bỏ các vòng vô hạn như trình biên dịch C++ của Intel với -O2 không?
#include <cstdio>
class tClassA{
public:
int m_first, m_last;
tClassA() : m_first(0), m_last(0) {}
~tClassA() {}
bool isEmpty() const {return (m_first == m_last);}
void updateFirst() {m_first = m_first + 1;}
void updateLast() {m_last = m_last + 1;}
void doSomething() {printf("should not reach here\r\n");}
};
int main() {
tClassA q;
while(true) {
while(q.isEmpty()) ;
q.doSomething();
}
return 1;
}
Có nghĩa vụ dừng tại while(q.isEmpty())
. Khi -O2
được bật theo ICC (bản phát hành), tuy nhiên, nó bắt đầu "doSomething" vô hạn.
Vì đây là chương trình đơn luồng vàisEmpty()
nên được đánh giá là true
, tôi không thể tìm thấy lý do nào để ICC hoạt động theo cách này? Tôi có nhớ gì không?
nó giúp nếu m_first và m_last được khai báo là 'bay hơi'? Tôi không có quyền truy cập vào ICC. – Chubsdad
Một ý nghĩ hoang dã khác: nó có liên quan đến thực tế là% s không được chỉ định với printf. printf ("% s", "không nên đến đây \ r \ n") ;? – Chubsdad
Liên quan: [Trình biên dịch có được phép loại bỏ vòng lặp vô hạn không?] (Http://stackoverflow.com/questions/2178115/are-compilers-allowed-to-eliminate-infinite-loops) –