2010-03-16 28 views
6

Tôi đang sử dụng gcc với tối ưu hóa chức năng -finline cho bản phát hành bản phát hành. Để chống lại code bloat bởi vì tôi làm việc trên một hệ thống nhúng tôi muốn nói không inline các chức năng cụ thể. Cách rõ ràng để làm điều này là thông qua các thuộc tính hàm tức là thuộc tính (noinline). Vấn đề là điều này dường như không hoạt động khi tôi chuyển sang tối ưu hóa chức năng toàn cầu -finline là một phần của chuyển đổi -O3.hành vi gcc -finline-functions?

Nó cũng có một số việc cần làm với nó được tạo khuôn mẫu như là một phiên bản không có khuôn mẫu của cùng một chức năng không nhận được nội tuyến như mong đợi.

Có ai biết cách kiểm soát nội tuyến khi bật công tắc toàn cục này không?

Dưới đây là các mã:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

Không liên quan, nhưng số nhận dạng bắt đầu bằng dấu gạch dưới theo sau là chữ cái viết hoa được dành riêng cho trình biên dịch. – GManNickG

+0

Không nên __attribute __ ((noinline)) được gắn vào định nghĩa? – jpalecek

+0

@jpalecek: Không có lỗi biên dịch – user176168

Trả lời

4

Các docs for GCC's noinline nói:

thuộc tính chức năng này ngăn cản một hàm từ được xem xét để nội tuyến. Nếu chức năng không có tác dụng phụ, có tối ưu hóa khác với nội tuyến làm cho các cuộc gọi chức năng được tối ưu hóa đi, mặc dù cuộc gọi chức năng là trực tiếp. Để giữ cho các cuộc gọi như vậy từ được tối ưu hóa đi, đưa

 asm (""); 

(thấy mở rộng Asm) trong hàm gọi, để phục vụ như một tác dụng phụ đặc biệt

Tôi nghĩ rằng những gì có thể xảy ra với bạn là vì hàm Base::fooT<> không có tác dụng phụ, GCC đang gọi các tối ưu hóa không xác định khác được đề cập ở trên.

+0

Xin lỗi vì sự chậm trễ trong việc trả lời! Nope buồn bã gcc vẫn inlines nó, tôi đã thử điều này trước đây. Tôi đang sử dụng 4.1.1 không ai biết một lỗi liên quan đến điều này? Cảm ơn câu trả lời mặc dù dường như không có nhiều kiến ​​thức khủng khiếp về chủ đề này ... – user176168

1

Hãy thử đặt thuộc tính noinline sau static và trước khi định nghĩa như sau:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

này đã làm việc cho tôi và dường như làm việc cho người khác quá, xem: How can I tell gcc not to inline a function?

Đối với một số lý do nó doesn 't làm việc đưa các thuộc tính noinline sau khi chức năng hoặc bằng cách đặt các asm("") trong cơ thể chức năng mặc dù những gì các tài liệu gcc nói.

1

Chủ đề cũ nhưng đáng trả lời. Nếu không có gì ở trên phù hợp với bạn, luôn có cách giải quyết đơn giản. Bạn phải ẩn cài đặt từ đơn vị dịch mà bạn muốn sử dụng phương thức như vậy bằng cách đặt nó vào một tệp cpp khác.

EDIT

Trong GCC> = 4,5 có một thuộc tính noclone mà thay noinline theo cách của chuyên cung cấp các chức năng.