werden aufrufe bei der optimierung restlos entfernt?



  • long Funktion ( char* )
    {
      #ifdef _DEBUG
      //mach was
      //mach was
      //mach was
      #endif
    
      //es wir eine konstante zurückgegeben
      return 0;
    }
    
    int main()
    {
      //der rückgabewert wird nicht zugewiesen/ausgewertet
      Funktion ( "test" );
      return 0;
    }
    

    die frage ist ob der c++ standard besagt, dass funktionsaufrufen zu leeren funktionen vom compiler entfernt werden dürfen

    oder falls der c++ standard nichts dazu sagt, ob vc++/gcc den aufruf in der release fassung rauswerden würden

    (bitte keine vermutungen... vermuten kann ich selber ;))

    ziel ist es solchen code zu vermeiden:

    int main()
    {
      #ifdef _DEBUG
        Funktion ( "test" );
      #endif
    
      return 0;
    }
    


  • Sovok schrieb:

    die frage ist ob der c++ standard besagt, dass funktionsaufrufen zu leeren funktionen vom compiler entfernt werden dürfen

    Der Standard sagt nichts über die Codegenerierung, nur etwas über die Ausführungssemantik. Solange diese gleich bleibt, hat ein Compiler jegliche Freiheit bei der Umsetzung, inklusive Optimierung. Du kannst nicht herausfinden, ob der Funktionsaufruf wegoptimiert wurde oder nicht, also geht diese Frage den Standard nichts an.

    Ich würde sagen, du hast gute Chancen, wenn die Funktion in der Übersetzungseinheit, in der sie aufgerufen wird, auch mitsamt Definition sichtbar ist. Das zieht höchstwahrscheinlich nach sich, dass sie inline deklariert werden muss, um die One-Definition-Rule nicht zu verletzen. Ein sehr schlauer Compiler könnte die notwendigen Informationen dazu auch aus anderen Übersetzungseinheiten herausziehen, aber sowas ist eher die Ausnahme.



  • Ich vermute mal, dass trotz aller Optimierungen der Aufruf nicht so einfach entfernt wird, selbst dann nicht, wenn die Funktion außer der berechnung absolut gar nichts macht, und das Ergebnis verworfen wird.

    bitte keine vermutungen... vermuten kann ich selber

    :p



  • Bei folgendem Beispiel dürfte der Compiler höchstwarscheinlich die Funktion ignorieren

    int foo ()
    {
     return 0;
    }
    
    int main ()
    {
     foo ();
     cout << "Hello World\n";
    }
    

    Aber müssen tut er es nicht



  • ok andersrum gefragt

    wie umgehe ich hässlichen code wie

    #ifdef _DEBUG
      Funktion ( "test" );
    #endif
    
    oder
    
    #ifdef _DEBUG
      #define FUNC(a) Funktion ( a )
    #else
      #define FUNC(a)
    #endif
    
    int main()
    {
      FUNC ( "test" );
      return 0;
    }
    

    und erreiche dass eine funktion nur in der debugfassung existiert

    es geht um viele aufrufe in extrem zeitkritischen code
    d.h. wenn ich durch alle aufrufe an leere funktionen zusammen
    eine millisekunde verlier is mir das schon zuviel



  • um eine millisekunde zu verlieren, müssten das verdammt viele aufrufe sein.



  • Inline-Funktionen statt Makros verwenden.

    void real_foo();
    
    inline void foo() {
      #ifdef DEBUG
      real_foo();
      #endif
    }
    ...
    void blah() {
      foo();
    }
    


  • otze schrieb:

    um eine millisekunde zu verlieren, müssten das verdammt viele aufrufe sein.

    kommt wohl auch auf die grösse des systems an -> embedded
    abgesehn davon summieren sich die aufrufe der oberen schichten an die unteren sehr schnell


Anmelden zum Antworten