Làm cách nào để tắt tối ưu hóa trình biên dịch trong gcc?


78

Tôi đang cố gắng học hợp ngữ. Tôi đã tìm kiếm và tìm thấy cách tháo rời một .ctệp nhưng tôi nghĩ rằng nó tạo ra một số phiên bản được tối ưu hóa của chương trình. Có cách nào để tôi có thể xem mã lắp ráp chính xác tương ứng với tệp C của tôi không.


1
các tùy chọn gcc kiểm soát tối ưu hóa gcc.gnu.org/onlineocs/gcc-3.3.1/gcc/Optimize-Options.html
abeln

3
được tối ưu hóa mã chính xác tương ứng với tệp C của bạn. Nhìn vào sự tháo gỡ của mã chưa được tối ưu hóa sẽ tạo ra ấn tượng sai. Nó sẽ khiến bạn nghĩ rằng bạn có thể làm tốt hơn.
Hans Passant

1
Giống như Hans nói - ý tưởng viết bằng mã lắp ráp là để làm điều đó tốt hơn trình biên dịch. Nếu bạn nhìn vào mã được tối ưu hóa, bạn sẽ thấy nó khó đến mức nào!
Bo Persson


Câu trả lời:


108

Tùy chọn gcc -Ocho phép các mức độ tối ưu hóa khác nhau. Sử dụng -O0để tắt chúng và sử dụng -Sđể lắp ráp đầu ra. -O3là mức tối ưu hóa cao nhất.

Bắt đầu với gcc 4.8, mức tối ưu hóa -Ogcó sẵn. Nó cho phép tối ưu hóa mà không ảnh hưởng đến việc gỡ lỗi và là mặc định được khuyến nghị cho chu trình chỉnh sửa-biên dịch-gỡ lỗi tiêu chuẩn.

Để thay đổi phương ngữ của hội đồng thành intel hoặc att hãy sử dụng -masm=intelhoặc -masm=att.

Bạn cũng có thể kích hoạt một số tối ưu hóa theo cách thủ công với -fname.

Hãy xem hướng dẫn sử dụng gcc để biết thêm.


33
-O0là mặc định (không tối ưu hóa) nếu bạn chưa chỉ định bất kỳ cờ -O nào.
nos

11
Với -O0 bạn vẫn có tối ưu hóa: Giảm thời gian biên dịch và thực hiện gỡ lỗi tạo ra kết quả như mong đợi.
klm123

@ klm123 Đúng vậy, nhưng đó là kết quả mà bạn có thể đạt được, điều đó tốt hơn là không có gì.
pmr

3
Nếu bạn có một gcc hiện đại hợp lý hỗ trợ -Og, hãy thử nó, tôi thấy rằng nó thường cho đầu ra hợp ngữ dễ đọc hơn -O0.
Viktor Dahl,

@ViktorDahl Cảm ơn vì gợi ý. Tôi khắc phục câu trả lời.
pmr

10

Đối với gcc, bạn muốn bỏ qua bất kỳ tùy chọn -O1 -O2 hoặc -O3 nào được chuyển đến trình biên dịch hoặc nếu bạn đã có chúng, bạn có thể thêm tùy chọn -O0 để tắt lại. Nó cũng có thể giúp bạn thêm -g để gỡ lỗi để bạn có thể xem nguồn c và mã máy đã tháo rời trong trình gỡ lỗi của mình.

Xem thêm: http://sourceware.org/gdb/onlineocs/gdb/Optimized-Code.html


9

Để kiểm tra mà không cần sao chép elision và thấy bạn sao chép / di chuyển các hàm tạo / toán tử trong hoạt động, hãy thêm "-fno-elide-constructors".

Ngay cả khi không có tối ưu hóa (-O0), GCC và Clang vẫn sẽ thực hiện thao tác sao chép, có tác dụng bỏ qua các hàm tạo sao chép / di chuyển trong một số trường hợp. Xem câu hỏi này để biết chi tiết về sao chép tách rời.

Tuy nhiên, trong Clang 3.4, nó kích hoạt một lỗi (một đối tượng tạm thời không hợp lệ mà không gọi hàm tạo), lỗi này đã được sửa trong 3.5.


7

Sử dụng tùy chọn dòng lệnh -O0(- [capital o] [zero]) để tắt tính năng tối ưu hóa và -Snhận tệp hợp ngữ. Nhìn vào đây để xem thêm các tùy chọn dòng lệnh gcc.


4

Lâu rồi, nhưng vẫn cần.


4

Bạn cũng có thể kiểm soát tối ưu hóa nội bộ với #pragma GCC push_options


3

Bạn có thể tắt tối ưu hóa nếu bạn vượt qua -O0 bằng dòng lệnh gcc.

Ví dụ: biến tệp .C thành lệnh gọi tệp .S:

gcc -O0 -S test.c


3
-O0là thừa vì nó là mặc định.
Jens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.