2012-11-05 45 views
8

Phần này của hướng dẫn gcc là khá mơ hồ và tôi không thể hiểu việc sử dụng các thuộc tính forceinline sau khi lặp đi lặp lại cố gắng.lực nội tuyến chức năng trong đơn vị dịch khác

Tôi đang xác định một đối tượng và một số chức năng nhất định để điều khiển đối tượng đó. Rất ít trong số các hàm đó có thể sử dụng các lệnh nguyên tử và tôi muốn trình biên dịch nội tuyến các hàm đó. Tuy nhiên tôi không muốn viết những chức năng trong tập tin tiêu đề và tuyên bố chúng với "tĩnh nội tuyến" như trong hạt nhân Linux.

Có cách nào để ép gcc thành các hàm nội tuyến từ một đơn vị dịch khác không?

Trả lời

9

bạn có thể sử dụng thuộc tính always_inline, ví dụ:

void foo() __attribute__((always_inline)); 

Từ docs

always_inline Nói chung, chức năng này không inlined trừ khi tối ưu hóa được xác định. Đối với các hàm được khai báo nội dòng, thuộc tính này inline các chức năng ngay cả khi không có mức tối ưu được chỉ định.

Note1: Không có nhu cầu sử dụng inline nếu bạn sử dụng always_inline thuộc tính

Note2: Nếu chức năng không thể được inlined bạn sẽ nhận được một cảnh báo, nếu ví dụ định nghĩa không phải là có sẵn khi biên dịch, tuy nhiên, tại gcc tối ưu hóa cao hơn vẫn có thể đưa nội tuyến vào trong trình gọi, cũng có một chuyển đổi cụ thể cho điều đó:

-funit-at-a-time 

Từ docs:

mức Optimization -O2 trở lên, đặc biệt, cho phép đơn vị-at-a-thời gian chế độ, mà cho phép trình biên dịch để xem xét thông tin thu được từ các chức năng sau trong file khi biên dịch một hàm . Biên dịch nhiều tệp cùng một lúc thành một tệp đầu ra ở chế độ đơn vị-at-a-time cho phép trình biên dịch sử dụng thông tin thu được từ tất cả các tệp khi biên dịch từng tệp trong số.

Note3: Nó không phải là cần thiết để có một nguyên mẫu rõ ràng để bạn có thể sử dụng thuộc tính về chức năng defintion:

__attribute__((always_inline)) void foo() { 
    //some code 
} 

Xem thêm discussion này, nó trả lời một số câu hỏi của bạn.

+0

có hoạt động ngay cả khi định nghĩa của hàm không khả dụng khi một đơn vị nhất định đang được biên dịch? trình biên dịch xử lý tình huống như thế nào .. – sgupta

+1

@ user1075375 làm thế nào để định nghĩa một hàm không có sẵn? nó phải ở đó nếu không nó sẽ không biên dịch/liên kết – iabdalkader

+1

"Nếu thực hiện hàm không có trong tệp tiêu đề và trong một đơn vị biên dịch riêng biệt, nó không thể được gạch trừ trừ khi bạn có trình biên dịch có thể thực hiện LTCG" từ http: // stackoverflow.com/questions/5187735/how-to-inline-string-h-function-on-linux?rq = 1 – sgupta

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