2010-07-15 36 views
11

Khi biên dịch C++ với GCC 4.4 hoặc MSVC, trình biên dịch có thể phát ra các thông điệp khi một hàm được gạch chân không?Tìm hiểu các chức năng nào được inline

+0

Câu hỏi hay nhưng tôi tò mò về động cơ của bạn. – Daniel

+0

Tôi tái cấu trúc mã di chuyển rất nhiều mã từ tiêu đề đến tập tin cpp và bây giờ nó chạy chậm hơn. Tôi muốn xem nếu có sự khác biệt về số lượng chức năng nội tuyến –

+0

Bạn đang xây dựng như thế nào? Phát hành hoặc gỡ lỗi? Bạn đang chỉ định/OPT cho Visual Studio là gì? –

Trả lời

2

Với g ++, tôi không nghĩ rằng bạn có thể làm cho g ++ báo cáo đó, nhưng bạn có thể kiểm tra nhị phân kết quả với bất kỳ công cụ cho thấy biểu tượng, nm ví dụ:

#include <iostream> 
struct T { 
     void print() const; 
}; 
void T::print() const { std::cout << " test\n" ; } 
int main() 
{ 
     T t; 
     t.print(); 
} 

~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 
0000000000400800 t _GLOBAL__I__ZNK1T5printEv 
0000000000400830 T _ZNK1T5printEv 

vs

#include <iostream> 
struct T { 
     void print() const { std::cout << " test\n" ; } 
}; 
int main() 
{ 
     T t; 
     t.print(); 
} 
~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 

(không có đầu ra từ nm trong trường hợp thứ hai)

CHỈNH SỬA: Ngoài ra, có thể sử dụng profilers. gprof cho thấy, trên hai ví dụ này:

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to _ZNK1T5printEv 
0.00  0.00  0.00  1  0.00  0.00 T::print() const 

so với chỉ

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to main 
+5

FWIW, tùy thuộc vào cách các chức năng được sử dụng, trình biên dịch có thể nội tuyến một số trường hợp và không phải người khác. Nếu chương trình đủ lớn, điều gì đó phức tạp hơn sẽ là cần thiết. – Cogwheel

+0

Thật vậy. Tôi tự hỏi nếu bất kỳ profilers báo cáo một cái gì đó như thế (gprof không xuất hiện). Có thể là một công cụ nhỏ hữu ích để viết. – Cubbi

+0

Cảm ơn. Tôi có thể thấy sự khác biệt trong các tệp nhị phân được biên dịch. Phiên bản chỉ tiêu đề dường như đã có nhiều chức năng hơn. Tôi chạy trên gprof trước (biên dịch với -pg) và không thể có nhiều sự khác biệt giữa hai. Tôi chỉ chạy các chương trình trên callgrind và phiên bản tiêu đề chỉ xuất hiện để có inlined tại rất nhiều chức năng như họ không hiển thị trong đầu ra callgrinds. –

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