Tại sao không tối ưu hóa trình biên dịch C++ hiện đại đi vòng đơn giản như thế này? (Kêu vang, MSVC)


0 Phiếu
Đã hỏi 25/5/2016 bởi get_8316 (530 điểm)
Khi tôi compile và chạy này code với kêu vang (-O3) hoặc MSVC
#include <stdio.h>
#include <time.h>
static int const N = 0x8000;
int main()
{
    clock_t const start = clock();
    for (int i = 0; i < N; ++i)
    {
        int a[N];    // Never used outside of this block, but not optimized away
        for (int j = 0; j < N; ++j)
        {
            ++a[j];  // This is undefined behavior too, but Clang doesn't see it
        }
    }
    clock_t const finish = clock();
    fprintf(stderr, "%u ms\\n",
        static_cast<unsigned int>((finish - start) * 1000 / CLOCKS_PER_SEC));
    return 0;
}
(/O2)...... loop không nhận được tối ưu hóa đi. Hơn nữa, kêu vang cả 3.6 không Visual c + + 2013 không GCC 4.8.1 nói với tôi rằng variable uninitialized! Bây giờ tôi nhận ra rằng việc thiếu một optimization không phải là một lỗi mỗi se, nhưng tôi tìm thấy này đáng kinh ngạc được đưa ra như thế nào trình biên dịch có nghĩa vụ phải khá thông minh ngày nay. Điều này có vẻ giống như một mảnh đơn giản của code ngay cả liveness kỹ thuật phân tích từ một thập kỷ trước nên có thể chăm sóc tối ưu hóa đi variable a và do đó loop toàn bộ - không bao giờ tâm thực tế là incrementing the variable đã undefined hành vi. Tuy nhiên, chỉ GCC là có thể tìm ra rằng nó là một no-op, và không ai trong số các trình biên dịch nói với tôi rằng đây là một biến uninitialized. Đây là lý do tại sao? Điều gì ngăn cản đơn giản liveness phân tích nói với compiler a đó là không sử dụng? Hơn nữa, tại sao không phải là compiler phát hiện a[j] đó là uninitialized ở nơi đầu tiên? Tại sao các hiện tại uninitialized biến-máy kiểm tra trong tất cả các trình biên dịch không thể bắt lỗi này rõ ràng?

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...