Đây là một c chương trình đơn giản ++ sử dụng valarrays:Tại sao tối ưu hóa GCC không hoạt động với valaray?
#include <iostream>
#include <valarray>
int main() {
using ratios_t = std::valarray<float>;
ratios_t a{0.5, 1, 2};
const auto& res (ratios_t::value_type(256)/a);
for(const auto& r : ratios_t{res})
std::cout << r << " " << std::endl;
return 0;
}
Nếu tôi biên dịch và chạy nó như thế này:
g++ -O0 main.cpp && ./a.out
Kết quả được như mong đợi:
512 256 128
Tuy nhiên, nếu Tôi biên dịch và chạy nó như sau:
g++ -O3 main.cpp && ./a.out
Đầu ra là:
0 0 0
Cùng xảy ra nếu tôi sử dụng tham số tối ưu hóa -O1
.
phiên bản GCC là (mới nhất trong Archlinux):
$ g++ --version
g++ (GCC) 6.1.1 20160707
Tuy nhiên, nếu tôi cố gắng với kêu vang, cả hai
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
và
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
tạo ra kết quả chính xác như nhau:
512 256 128
phiên bản Clang là:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
Tôi cũng đã thử với GCC 4.9.2 trên Debian, nơi thực thi ra kết quả đúng.
Đây có phải là lỗi có thể xảy ra trong GCC hay tôi đang làm điều gì sai? Bất cứ ai có thể sao chép này?
EDIT: Tôi đã quản lý để tạo lại sự cố cũng trên phiên bản Homebrew của GCC 6 trên Mac OS.
Sử dụng http://melpon.org/wandbox nó xuất hiện những thay đổi hành vi từ 4.9.3 đến 5.1. – NathanOliver
Thật không may, trong codebase của tôi, tôi cũng quản lý để tái tạo vấn đề tương tự (nhưng với uint32_t) ngay cả trên GCC 4.9.3, tuy nhiên nó hoạt động khi đưa vào ví dụ tối thiểu. Tôi đang điều tra ... – DoDo