2009-04-02 10 views
7

Lên đến một thời gian trước đây cơ sở mã của tôi rất gần với địa chỉ #include. Mỗi lần tôi thay đổi một tệp .h quan trọng thậm chí nhẹ nhàng, tất cả các tệp đã được biên dịch lại.
Lý do chính cho sự phụ thuộc tiêu đề cao như vậy là tôi có nhiều chức năng nhỏ cần phải nội tuyến và tôi đã ấn tượng rằng để làm việc nội dòng họ cần phải có cùng đơn vị dịch như mã gọi, vì vậy họ cần để ở trong tiêu đề. Đối với các chức năng nội tuyến để thậm chí biên dịch các tiêu đề khác cần phải được bao gồm trong tiêu đề là tốt, quảng cáo tối ưu.C++: Chức năng nội tuyến và tạo mã thời gian liên kết

Nhập link-time code generation (trong Visual Studio). Một trong những ưu điểm chính của điều này là chức năng nội tuyến hiện tại có thể vượt qua các đơn vị dịch thuật.
Nhưng tôi vẫn còn bực mình. Làm thế nào tôi có thể thực sự chắc chắn rằng các chức năng này thực sự có được nội tuyến? Tôi nhận ra rằng trình biên dịch về cơ bản có thể làm bất cứ điều gì địa ngục nó muốn không có vấn đề mà tôi xác định chức năng.

Có cách nào để kiểm tra nội dung được gạch chân không?

+0

Tại sao cần thiết phải có những chức năng này? Điều đó có vẻ lạ. Thông thường, bạn muốn các chức năng được gạch chân * khi nó mang lại hiệu quả *, trình biên dịch thường có khả năng xác định tốt hơn bạn – jalf

+0

@ Rüdiger Stevens - Thực ra, điều đó là có thể. Kiểm tra tùy chọn ': PGINSTRUMENT' của VC++ trên cờ/LTCG. http://msdn.microsoft.com/en-us/library/xbf3tbeh%28VS.80%29.aspx –

Trả lời

1

Khi bạn có tệp thi hành, bạn có thể sử dụng các công cụ để kiểm tra và tìm kiếm tên của các hàm nội tuyến trong các bảng biểu tượng. Một công cụ hữu ích như vậy là Dependency Walker. Điều này tất nhiên giả sử bạn có thể nhận được một xây dựng kết hợp cả hai cài đặt tối ưu hóa đủ cho trình biên dịch để làm phiền với nội tuyến, trong khi giữ lại các biểu tượng.

Đối với Visual Studio, tôi nghĩ rằng bản dựng "Bản phát hành" thường phù hợp với những người đó, nhưng tôi không hoàn toàn chắc chắn.

+1

Giữ lại các biểu tượng không phải là vấn đề với thông tin gỡ lỗi và tối ưu hóa được bật, nhưng một chức năng có thể được gạch chân tại một nơi, và không phải ở bên kia. –

+0

Danh sách người phụ thuộc chỉ liệt kê các hàm được xuất và nhập.Giả sử tôi có biểu tượng, làm thế nào tôi có thể nhận được một danh sách văn bản ra khỏi nó? – shoosh

+0

Rất tiếc, xấu của tôi, tôi đã không nhận ra. Có lẽ cổng này của công cụ Unix 'nm' thực hiện thủ thuật: . – unwind

3

Chắc chắn bạn không thực sự quan tâm liệu mọi thứ có được phác thảo hay không - bạn chỉ quan tâm xem hiệu suất có thỏa mãn hay không. Nhưng nếu bạn thực sự muốn tìm hiểu, kiểm tra mã trình biên dịch tạo ra. Bạn có thể làm điều này một cách dễ dàng nhất thông qua trình gỡ lỗi, sử dụng cửa sổ xem trình biên dịch.

3

Bạn không bao giờ có thể chắc chắn rằng các hàm được inlined. Nó tùy thuộc vào trình biên dịch để chọn nó. Nhưng bạn có thể làm cho trình biên dịch dễ dàng hơn bằng cách cho phép nó tìm mã đối tượng liên kết với hàm.

Đó là nơi tạo mã thời gian liên kết. Các trình biên dịch không tạo mã đối tượng nữa, chúng tạo ra một dạng ngôn ngữ trung gian và đó là trình liên kết thực sự biên dịch mã.

Để kiểm tra nội dung được đưa vào, tôi e rằng bạn đã bị bỏ lại để tạo đầu ra lắp ráp cùng với mã đối tượng của bạn. Điều đó cho phép bạn đọc mã đối tượng chính xác được tạo ra khi nói một hàm nhất định và nó sẽ rất rõ ràng cho dù có một "cuộc gọi" trong đó có quặng không.

3

Một cách tương đối dễ dàng là sử dụng hồ sơ. Nếu một hàm được gạch chân, bạn sẽ không thấy nó trong luồng đồ thị điều khiển.

7

Tôi biết điều cấm kỵ trong C++ để nói điều này, nhưng bạn có thể thực hiện các chức năng như macro tiền xử lý. Xin lỗi tôi trong khi tôi đang rửa miệng bằng xà phòng.

+0

+1: Bởi vì đôi khi nó là cơ hội cuối cùng để cho trình biên dịch biết "nội tuyến" chức năng của bạn nếu nó hoàn toàn khăng khăng không gạch chân nó, ngay cả khi bạn hoàn toàn biết hiệu suất sẽ tốt hơn :-) – mmmmmmmm