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;
}
Nie związane, ale identyfikatory zaczynające się od znaku podkreślenia i dużej litery są zarezerwowane dla kompilatora. – GManNickG
Czy atrybut __attribute __ ((noinline)) nie powinien być dołączony do definicji? – jpalecek
@jpalecek: Nie, to jest błąd kompilacji – user176168