2012-03-19 21 views
6

Nếu tôi không khai báo hàm f như được gạch chân. Chỉ cần như sau:chức năng tự động được gạch chân trên các đơn vị dịch và gcc 4.6

Ah:

X f(Y y); 

A.cpp:

X f(Y y) 
{ 
    ... 
} 

Sau đó, trong một đơn vị dịch thuật khác nhau:

B.cpp:

#include "A.h" 

Z g(W w) 
{ 
    ... 
    ... f(...) ... 
    ... 
} 

Sau đó tôi biên dịch hai đơn vị dịch thuật A.o và B.o với gcc 4.6, và sau đó liên kết chúng cũng thông qua gcc. (Có thể với -O3 cho cả hai bước)

Gcc sẽ xem xét nội tuyến chức năng cho hiệu suất tại thời gian liên kết? Hoặc là nó quá muộn?

Trong một đánh giá mã, ai đó đã đề xuất rằng tôi không nên khai báo các chức năng của tôi dưới dạng nội tuyến vì trình biên dịch biết rõ hơn tôi làm khi vào nội tuyến. Tôi đã luôn luôn theo ấn tượng, trừ khi chức năng được xác định trong tiêu đề hơn trình biên dịch không có tùy chọn để inline nó.

(Nếu câu trả lời khác nhau cho chế độ C, C++ chế độ, hoặc gnu ++ 0x chế độ xin vui lòng chỉ này ra cũng)

+0

Tại sao bạn muốn làm một điều như vậy? 'inline' chỉ được phát minh cho điều đó. Nó cho phép bạn có định nghĩa của hàm trong tệp tiêu đề mà không có lỗi "nhiều biểu tượng được xác định". Và nó hoạt động khá tốt hiện nay, trình biên dịch có chiến lược tốt khi có hiệu quả nội tuyến một chức năng hay không. –

+0

@JensGustedt: Tại sao? Sự lười biếng. Tôi muốn rằng trình tối ưu hóa tìm ra khi tốt nhất để inline một hàm, giống như cách nó tính toán khi đặt một biến cục bộ trong một thanh ghi thay vì trên stack. Tôi nghĩ đây là một cái nhìn không gây tranh cãi, và bạn đã bỏ lỡ vấn đề. –

+0

Hm, đó là chính xác những gì tôi đã nói. Cho trình biên dịch cơ hội để làm điều đó cho bạn. 'inline' không có nghĩa là bất kỳ điều gì khác ngoài việc yêu cầu trình biên dịch thực hiện nó khi nó thích hợp. Để ở lại với ví dụ của bạn, một biến cục bộ là hoàn toàn có thể nhìn thấy tại điểm mà trình biên dịch quyết định giữ nó trong sổ đăng ký hoặc tràn nó. Viết mã sạch, và trình biên dịch sẽ được tốt đẹp với bạn. Và thành thực mà nói, tại sao việc định nghĩa hàm trong tệp tiêu đề khó khăn hơn trong một .c? Chính xác cùng một văn bản ở một địa điểm khác? –

Trả lời

12

Tính năng này được gọi là Link Time Optimization(LTO) và không được kích hoạt theo mặc định trong GCC 4.6

[sửa] Với LTO kích hoạt, GCC sẽ tiết kiệm được một "GIMPLE" đại diện của X f(Y y) trong A.obj. Biểu diễn này được xử lý một chút so với xử lý trước C++ thông thường, nhưng không nhiều. Đặc biệt, nó chưa được dịch sang hội đồng. Kết quả là, mối liên kết vẫn có thể nội tuyến nó.

+0

Bạn có thể thêm mô tả ngắn gọn về cách thức hoạt động trong trường hợp cụ thể này không? Tôi không có manh mối về điều này. –

-1

Tôi không nghĩ rằng gcc có thể tạo làm cho chức năng chia thành file nguồn khác nhau như inline. Nó chỉ hoạt động nếu bạn khai báo chúng trong cùng một tệp nguồn.

-1

Trình biên dịch có thể chọn nội tuyến hay không để cải thiện hiệu suất. Nhưng trong trường hợp này trình biên dịch là bất lực tôi nghĩ. không có cách nào nó có thể inline chức năng f.

NB: Ngay cả khi bạn chỉ sử dụng từ khóa đề xuất của từ khóa. quyết định cuối cùng về việc liệu có nội tuyến hay không là tối đa trình biên dịch. Vì vậy, không có bất kỳ vấn đề trong đề xuất để trình biên dịch.

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