Ich benutze gcc mit der -finline-Funktionen Optimierung für Release-Builds. Um Code Bloat zu bekämpfen, weil ich an einem eingebetteten System arbeite, möchte ich sagen, dass bestimmte Funktionen nicht inline sind. Der offensichtliche Weg, dies zu tun, wäre durch Funktionsattribute, dh Attribut (Noinline). Das Problem ist, das scheint nicht zu funktionieren, wenn ich die Global-Finline-Funktionen-Optimierung, die Teil der -O3-Schalter ist, einschalten.gcc -finline-Funktionen Verhalten?
Es hat auch etwas damit zu tun zu sein, da eine nicht vorgestanzte Version der gleichen Funktion nicht inline wird, was wie erwartet ist.
Hat jemand eine Idee, wie man das Inlining steuert, wenn dieser globale Schalter eingeschaltet ist?
Hier ist der Code:
#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;
}
Nicht verwandt, aber Bezeichner, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen, sind für den Compiler reserviert. – GManNickG
Sollte das Attribut __ ((noinline)) nicht an die Definition angehängt werden? – jpalecek
@jpalecek: Nein, das ist ein Kompilierungsfehler – user176168