2 Stimmen

Warum beachtet g++ nicht __attribute__((pure)) für virtuelle Funktionen?

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X