2009-12-14 21 views
5

Tôi phải kiểm tra xem một hàm có đang được biên dịch bởi trình biên dịch hay không. Có cách nào để làm điều này mà không cần nhìn vào lắp ráp (mà tôi không đọc). Tôi không có lựa chọn nào trong việc tìm ra điều này, vì vậy tôi thích nếu chúng ta không thể thảo luận về sự khôn ngoan của việc này. Cảm ơn!MSVC - Bất kỳ cách nào để kiểm tra xem chức năng có thực sự được gạch chân không?

Trả lời

1

Tạo tệp "MAP". Điều này cung cấp cho bạn địa chỉ của tất cả các chức năng không được nội tuyến. Nếu chức năng của bạn xuất hiện trong danh sách này, nó sẽ không được gạch chân, nếu không nó sẽ được inline hoặc được tối ưu hóa hoàn toàn (ví dụ: khi nó không được gọi).

5

Mỗi trang web cuộc gọi có thể khác nhau.

Trình biên dịch có thể quyết định cho một số phương thức cha mẹ nào đó có giá trị nội tuyến và đối với các phương thức cha mẹ khác mà nó không có giá trị nội tuyến. Vì vậy, bạn có thể không thực sự xác định câu trả lời thực sự mà không kiểm tra assembley tại mỗi trang web cuộc gọi.

Kết quả là bất kỳ công cụ nào bạn sử dụng đều có khả năng sẽ cung cấp cho bạn câu trả lời gây hiểu lầm. Nếu bạn sử dụng một công cụ kiểm tra sự tồn tại của biểu tượng (nó có thể có bởi vì một số trang web gọi cần nó, nhưng có khả năng nó có thể được inlined ở những người khác). Ngược lại việc thiếu biểu tượng không có nghĩa là phương thức/chức năng không được gạch chân nó có thể là tĩnh (như trong tệp tĩnh) và do đó trình biên dịch không cần giữ biểu tượng xung quanh (nhưng nó không được gạch chân).

2

Sử dụng tùy chọn trình biên dịch/FAs để kết xuất mã asm bằng mã nguồn là cách duy nhất tôi biết chắc chắn.

Lưu ý: nếu bạn muốn ép buộc chức năng nội tuyến, chỉ cần sử dụng __forceinline.

+0

__forceinline không buộc nội tuyến trong mọi trường hợp. http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx –

0

Nếu bạn thực sự không muốn nhảy vào lắp ráp, hãy khai báo hàm là __forceinline và nếu tệp thực thi lớn hơn, bạn biết nó không được gạch chân.

+1

Không nhất thiết. Một thành viên điển hình có được chức năng, ví dụ, thực sự có thể dẫn đến mã nhỏ hơn khi inlined. Nó sẽ dẫn đến một truy cập thành viên thông qua con trỏ này chứ không phải là một đẩy này, gọi hàm, truy cập thành viên thông qua này, trở về từ chức năng. –

+0

Đúng, nhưng nếu nó đã được lót, __forceinline không nên thay đổi bất cứ điều gì, vì vậy những gì tôi nên nói là nếu kích thước thực thi thay đổi. Nắm bắt tốt. – Overflowed

+0

-1, vấn đề là ngược lại không đúng vì những lý do mà Richard đưa ra. Nếu tệp thực thi không thay đổi kích thước của nó, bạn có thể kết luận điều gì? – MSalters

6

Nếu bạn bật cảnh báo C4714, C4710 và C4711, nó sẽ cung cấp cho bạn thông tin khá chi tiết về các chức năng nào và không được gạch chân.

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