Nach Angaben von die GCC-Dokumentation , __attribute__((pure))
teilt dem Compiler mit, dass eine Funktion keine Seiteneffekte hat und daher der üblichen Eliminierung von Unterausdrücken unterzogen werden kann.
Dieses Attribut scheint für nicht-virtuelle Funktionen zu funktionieren, aber nicht für virtuelle Funktionen. Betrachten Sie zum Beispiel den folgenden Code:
extern void f( int );
class C {
public:
int a1();
int a2() __attribute__((pure));
virtual int b1();
virtual int b2() __attribute__((pure));
};
void test_a1( C *c ) {
if( c->a1() ) {
f( c->a1() );
}
}
void test_a2( C *c ) {
if( c->a2() ) {
f( c->a2() );
}
}
void test_b1( C *c ) {
if( c->b1() ) {
f( c->b1() );
}
}
void test_b2( C *c ) {
if( c->b2() ) {
f( c->b2() );
}
}
Bei Kompilierung mit aktivierter Optimierung (entweder -O2 oder -Os), test_a2()
nur Anrufe C::a2()
einmal, aber test_b2()
ruft auf. b2()
zweimal.
Gibt es dafür einen Grund? Liegt es daran, dass, obwohl die Implementierung in der Klasse C
rein ist, kann g++ nicht davon ausgehen, dass die Implementierung in jeder Unterklasse ebenfalls rein ist? Wenn ja, gibt es eine Möglichkeit, g++ mitzuteilen, dass diese virtuelle Funktion und die Implementierung jeder Unterklasse rein sein werden?