2009-08-30 44 views
34

Tôi đang cố gắng tối ưu hóa rất nhiều phép nhân và con trỏ và muốn xem trình biên dịch làm gì bên dưới khi tôi đặt vào cờ tối ưu.Làm thế nào tôi có thể xem mã lắp ráp được tạo bởi trình biên dịch gcc (bất kỳ hương vị) nào cho chương trình C/C++?

--Edit--

Làm thế nào để hạn chế nó đến một chức năng cụ thể hoặc một khối mã?

--Edit_2--

Làm thế nào để tạo ra một gcc lắp ráp mã ít tiết?

+2

Một bản lắp ráp ít tiết hơn? chính xác thì ý bạn là gì khi nói vậy? –

+0

một mã lắp ráp. Nói cách khác, tôi không muốn những thứ dữ dội như khởi tạo hồ sơ kích hoạt, nhưng chỉ có mã relavent để statemetns của tôi. hy vọng nó làm cho nó rõ ràng hơn. – vehomzzz

+1

để bạn muốn gcc tạo mã assembly _incorrect_, chỉ đáp ứng được vẻ đẹp của bạn? Không, thưa ngài. –

Trả lời

35

Thêm -S chuyển sang dòng lệnh của bạn.

Chỉnh sửa: Đừng quên rằng nó sẽ đặt lắp ráp vào các tệp bạn chỉ định dưới khóa -o.

+0

Bạn có thể sử dụng 'gcc -O3 -march = native foo.c -S -o- | less' để pipe vào 'less' thay vì tạo một tập tin' .s'. Xem thêm [Cách tháo "tiếng ồn" khỏi đầu ra lắp ráp GCC/clang?] (Https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output) để biết thêm lời khuyên về việc nhìn thấy "phần thú vị" của đầu ra asm, đặc biệt là ** CppCon2017 nói chuyện của Matt Godbolt: ["Trình biên dịch của tôi đã làm gì cho tôi gần đây? Unbolting Compiler's Lid ”] (https://youtu.be/bSkpMdDe4g4) ** –

9

Làm cách nào để hạn chế chức năng cụ thể hoặc khối mã?

Đặt hàm đó vào một tệp nguồn riêng biệt (và sử dụng thông số dòng lệnh khác cho tệp nguồn đó).

+1

Đó là những gì tôi đã làm. Tôi tò mò nếu nó có thể chỉ từ các tùy chọn. – vehomzzz

+0

Điều này có thể không phản ánh cách nó thực sự được tối ưu hóa nếu nó có thể nội tuyến thành người gọi. (Đặc biệt với tối ưu hóa thời gian liên kết).Thậm chí có một tham số là một hằng số biên dịch-thời gian có thể tạo ra một sự khác biệt lớn, hoặc có sự liên kết hoặc kích thước của một mảng được biết có thể thay đổi tự động vector hóa rất nhiều. Nhưng có, điều này là tốt * nếu * bạn hiểu những gì bạn đang làm. –

2

Bạn có thể dừng chương trình tại điểm ngắt trong trình gỡ lỗi Visual Studio và thực hiện "hiển thị hội đồng" và thậm chí từng bước một hướng dẫn tại một thời điểm.

+3

Tại sao phản hồi này lại bị bỏ phiếu? Đó là một phản ứng hoàn toàn hợp lệ. – aaronsnoswell

+1

@aaronsnoswell Tôi đã không làm điều đó, nhưng có lẽ vì câu hỏi rõ ràng về GCC. – delicateLatticeworkFever

4

Bạn cũng có thể chạy chương trình đó trong trình gỡ lỗi như gdb và sử dụng chế độ xem tháo gỡ. Trong gdb bạn có thể sử dụng lệnh disass/m để xem lắp ráp được trộn với mã C trên vị trí hiện tại.

+0

Bạn có thể thêm một ví dụ tối thiểu không? 'disass/m' chỉ in' Không có khung nào được chọn.' –

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