2012-04-27 30 views
5

Khi sử dụng Microsoft Visual C++ (không phải CLI, chỉ là bản địa chuẩn C++) có làm tối ưu hóa nội tuyến lắp đặt để vô hiệu hóa cho hàm không?Khối nội tuyến (__asm) có thể ngăn chặn tối ưu hóa chức năng không?

Khi tôi kiểm tra bằng IDA, một số mã chức năng bên ngoài khối dường như thay đổi, nhưng tôi không chắc nguyên nhân là gì. Hàm này là (tương đối) đơn giản, có thao tác bit và một số phép toán, nhưng không có các cuộc gọi bên ngoài.

Các nguyên nhân khác có thể tôi có thể nghĩ đến là:

  • tắm trích lập để cho phép gỡ lỗi trong lắp ráp nội tuyến.
  • Thay đổi để xử lý ngoại lệ (thực sự không giống như thế này)
  • Một phần nội tuyến của một thứ khác do một số logic trình biên dịch không xác định.

Bất kỳ ý tưởng nào?

Trả lời

13

Có. Xem các bài viết MSDN: Optimizing Inline Assembly cũng như Advantages of Inline Assembly

Từ bài viết:

Sự hiện diện của một khối __asm trong một chức năng ảnh hưởng đến tối ưu hóa theo nhiều cách. Đầu tiên, trình biên dịch không cố gắng tối ưu hóa khối __asm. Những gì bạn viết trong ngôn ngữ lắp ráp là chính xác những gì bạn nhận được. Thứ hai, sự hiện diện của một khối __asm ​​ảnh hưởng đến lưu trữ biến đăng ký. Trình biên dịch tránh việc đăng ký các biến trên một khối __asm nếu nội dung của sổ đăng ký sẽ bị thay đổi bởi khối __asm. Cuối cùng, một số tối ưu hóa toàn chức năng khác sẽ bị ảnh hưởng bởi việc bao gồm ngôn ngữ assembly trong một hàm.

+0

Ah, vì vậy nó vô hiệu hóa * một số * nhưng không * tất cả * tối ưu hóa. Điều đó trả lời câu hỏi của tôi một cách hoàn hảo. Cảm ơn. – Polynomial

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