2010-03-16 11 views
6

Używam gcc z optymalizacją funkcji -finline dla wersji release. W celu zwalczania nadużywania kodu, ponieważ pracuję w systemie wbudowanym, chcę powiedzieć, że nie wprowadzam konkretnych funkcji. Oczywistym sposobem, aby to zrobić, jest użycie atrybutów funkcji, tj. atrybut (noinline). Problem polega na tym, że nie działa to, gdy włączam funkcję globalnej optymalizacji funkcji, która jest częścią przełącznika -O3.zachowanie funkcji gcc -finline?

Ma również coś wspólnego z szablonem, ponieważ niesformatowana wersja tej samej funkcji nie jest zgodna z oczekiwaniami.

Czy ktoś wie jak kontrolować inline przy włączaniu tego globalnego przełącznika?

Oto kod:

#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

Nie związane, ale identyfikatory zaczynające się od znaku podkreślenia i dużej litery są zarezerwowane dla kompilatora. – GManNickG

+0

Czy atrybut __attribute __ ((noinline)) nie powinien być dołączony do definicji? – jpalecek

+0

@jpalecek: Nie, to jest błąd kompilacji – user176168

Odpowiedz

4

docs for GCC's noinline powiedzieć:

Ten atrybut funkcja zapobiega funkcję przed uważany za inline. Jeśli funkcja nie ma skutków ubocznych, istnieją inne optymalizacje niż funkcja wstawiania, która powoduje, że wywołania funkcji są zoptymalizowane, mimo że wywołanie funkcji jest aktywne. Aby utrzymać takie połączenia przed zoptymalizowany daleko, umieścić

 asm (""); 

(patrz Rozszerzony ASM) w nazwie funkcji, aby służyć jako specjalny efekt uboczny

myślę, że to, co może się dziać z tobą jest to, że ponieważ funkcja Base::fooT<> nie ma skutków ubocznych, GCC wywołuje nieokreślone inne optymalizacje wspomniane powyżej.

+0

Przepraszamy za długie opóźnienie w odpowiedzi! Niestety gcc nadal to podkreśla, próbowałem już tego wcześniej. Używam 4.1.1 czy ktoś wie o błędzie dotyczącym tego? Dzięki za odpowiedź, choć nie wydaje się, że istnieje ogromna wiedza na ten temat ... – user176168

1

Spróbuj umieścić atrybut noinline po static a przed definicją tak:

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

ten pracował dla mnie i wydaje się działać dla innych też zobaczyć: How can I tell gcc not to inline a function?

Z jakiegoś powodu nie robi Działaj, wstawiając atrybut noinline po funkcji lub umieszczając asm("") w ciele funkcji, pomimo tego, co mówi dokumentacja gcc.

1

Trochę starej nitki, ale wartej odpowiedzi. Jeśli nic nie działa powyżej, zawsze istnieje proste obejście tego problemu. Musisz ukryć implementację od jednostki tłumaczeniowej, w której chcesz użyć takiej metody, umieszczając ją w innym pliku cpp.

EDIT

W GCC> = 4.5 jest atrybutem noclone które zastępują noinline w drodze specjalizujący funkcję.

Powiązane problemy