2015-07-15 13 views
9

Khi tôi biên dịch chương trình của tôi C++ với g++ bằng cách sử dụng tùy chọn -Og tôi thấy biến mà <optimized out>, và cũng là dòng hiện tại đôi khi bỏ qua xung quanh. Hành vi này có được mong đợi ở cấp độ tối ưu hóa này hay không hoặc tôi có vấn đề gì không? Trang người đàn ông của gcc nói:biến tối ưu hóa ra với g ++ và tùy chọn -Og

-Og

Tối ưu hóa gỡ lỗi kinh nghiệm. -Og bật tối ưu hóa không gây trở ngại cho việc gỡ lỗi. Nó sẽ là mức độ tối ưu của sự lựa chọn cho chu trình sửa lỗi biên dịch chuẩn, cung cấp mức tối ưu hợp lý trong khi duy trì biên dịch nhanh và trải nghiệm gỡ lỗi tốt.

vì vậy tôi không mong đợi hành vi này. Trên hệ thống của tôi, tôi có phiên bản g ++ 4.9.2 và phiên bản gdb 7.7.1.

+0

"... cung cấp mức tối ưu * hợp lý * ..." –

+1

Trình biên dịch được phép tối ưu hóa miễn là quy tắc * as-if * được tuân thủ. Điều này có thể bao gồm việc loại bỏ các biến (hoặc chuyển đổi thành các hằng số), cũng như việc bỏ các hàm không sử dụng. –

+0

Tôi hiểu. Vấn đề chính của tôi là dòng hiện tại bỏ qua xung quanh, và vào và ra khỏi các chức năng khác nhau theo cách tôi không mong đợi/hiểu. Nó sẽ là tốt nhất cho tôi sau đó, để sử dụng tùy chọn '-O0'? Hay có cách nào tốt để hiểu được hành vi và gắn bó với '-Og'? – Svaberg

Trả lời

0

Đây là hành vi bình thường khi biên dịch với tùy chọn -Og. Ở cấp độ tối ưu hóa này, trình biên dịch được phép tối ưu hóa miễn là nó tuân theo as-if rule. Điều này có thể bao gồm việc loại bỏ các biến (hoặc chuyển đổi thành các hằng số), cũng như việc bỏ các hàm không sử dụng.

Đề xuất hoặc là được sử dụng để bỏ qua hoặc để biên dịch với tùy chọn -O0.

+1

Hành vi đó có vẻ mâu thuẫn trực tiếp với xác nhận quyền sở hữu trong tài liệu đó là '-Og cho phép tối ưu hóa mà không can thiệp vào gỡ lỗi ". Nhìn thấy các giá trị của biến là một thành phần khá của gỡ lỗi. – BeeOnRope

Các vấn đề liên quan