Tôi đang sử dụng cho/trong khi vòng lặp để thực hiện một sự chậm trễ trong mã của tôi. Thời gian trễ là không quan trọng ở đây mặc dù nó đủ lớn để được chú ý. Đây là đoạn mã.cho vòng lặp bị bỏ qua (tối ưu hóa?) Ra
uint32_t i;
// Do something useful
for (i = 0; i < 50000000U; ++i)
{}
// Do something useful
Vấn đề tôi quan sát là vòng lặp này sẽ không được thực thi. Nó có thể bị bỏ qua/tối ưu hóa bởi trình biên dịch. Tuy nhiên, nếu tôi đủ điều kiện truy cập vòng lặp i
bởi dễ bay hơi, vòng lặp for dường như thực thi và tôi nhận thấy độ trễ mong muốn trong quá trình thực hiện.
Hành vi này có vẻ hơi phản trực giác với sự hiểu biết của tôi về tối ưu hóa trình biên dịch có/không có từ khóa dễ bay hơi.
Ngay cả khi bộ đếm vòng lặp được tối ưu hóa và được lưu trữ trong thanh ghi bộ xử lý, không nên bộ đếm vẫn hoạt động, có lẽ với độ trễ thấp hơn? (Kể từ khi bộ nhớ nạp trên không được thực hiện với.)
Nền tảng tôi đang xây dựng là bộ xử lý Xtensa (bởi Tensilica), và trình biên dịch C là trình biên dịch được cung cấp bởi Tensilica, trình biên dịch Xtensa C/C++ chạy với mức cao nhất tối ưu hóa.
Tôi đã thử cùng với gcc 4.4.7
với -o3
và mức tối ưu hóa của bánh mì nướng. Sự chậm trễ dường như hoạt động trong trường hợp đó.
Trình biên dịch c có thể phát hiện vòng lặp for không làm gì cả, và chỉ có thể loại bỏ toàn bộ vòng lặp khi tôi không biến động. – user1937198
Thành thật mà nói, nếu tôi là một trình biên dịch, tôi sẽ đặt tôi thành 50000000U và được thực hiện, đặc biệt là ở các mức tối ưu hóa cao. Với volatile, nó có thể được thay đổi bên ngoài, vì vậy tôi không thể tối ưu hóa nó ra và đọc nó từ sổ đăng ký/cache/bất cứ nơi nào trong bất kỳ iteration. – martin
Trình biên dịch không quan tâm đến việc bảo tồn các biến hoặc vòng lặp của bạn; nó quan tâm đến việc bảo tồn những thứ như đầu vào và đầu ra. Tách ra một vòng lặp không có gì là hoàn toàn được phép. – user2357112