Có, ngữ nghĩa nó sẽ được đánh giá trên mỗi vòng lặp. Trong một số trường hợp, trình biên dịch có thể có thể tự động loại bỏ điều kiện khỏi vòng lặp - nhưng không phải lúc nào cũng vậy. Đặc biệt:
void foo(const struct rect *r) {
for (int i = 0; i < r->width * r->height; i++) {
quux();
}
}
Trình biên dịch sẽ không thể để di chuyển nhân ra trong trường hợp này, như đối với tất cả nó biết quux()
đổi r
.
Nói chung, thường chỉ các biến cục bộ mới đủ điều kiện để nâng biểu thức ra khỏi vòng lặp (giả sử bạn không bao giờ lấy địa chỉ của chúng!). Mặc dù trong một số điều kiện cấu trúc các thành viên có thể đủ điều kiện, có rất nhiều thứ có thể khiến trình biên dịch giả định mọi thứ trong bộ nhớ đã thay đổi - chỉ viết về bất kỳ con trỏ nào hoặc gọi hầu như bất kỳ hàm nào. Vì vậy, nếu bạn đang sử dụng bất kỳ người không phải là người dân địa phương ở đó, tốt nhất là giả sử tối ưu hóa sẽ không xảy ra.
Điều đó nói rằng, nói chung, tôi muốn chỉ khuyên bạn nên chủ động di chuyển có khả năng mã đắt tiền ra khỏi tình trạng này nếu nó hoặc là:
- Không tổn thương khả năng đọc để làm như vậy
- Rõ ràng sẽ mất một rất thời gian dài (ví dụ: truy cập mạng)
- Hoặc hiển thị dưới dạng điểm phát sóng trên hồ sơ.
Xin lỗi người đã trả lời rất lâu, nhưng câu trả lời này giải thích mọi thứ cho tôi một cách rõ ràng và súc tích. – Faken
Nhưng đừng quên đưa ra ý kiến của bdonlan về việc sử dụng các biến cục bộ để điều khiển vòng lặp - người dân địa phương giúp mọi người dễ dàng tối ưu hóa các trình biên dịch vì khả năng hiển thị của chúng bị hạn chế (điều này cũng có thể giúp người đọc hiểu, không chỉ tối ưu hóa trình biên dịch). –
Tôi sẽ không xin lỗi nếu tôi là bạn. Điều này cho bdonlan một shot tốt tại huy hiệu "populist", với 9 phiếu bầu nhiều hơn (tại thời điểm viết bài) và nếu Lulu nhận thêm 8 :-) –