API Tuning



  • Hallo,

    ich code gerade an einer Schnittstellen-Klasse, die die Funktionsaufrufe im Prinzip nur an die Implementierung einer abstrakten Basisklasse weiterrreicht, in etwa so:

    class Schnittstelle {
    private:
       Interface *interface;
       Interface();
    public:
       Schnittstelle(Interface& _interface);
       void setFoo(const int id, const int value);
       bool getFoo(const int id, int& value);
       ...
    };
    
    void Schnittstelle::setFoo(const int id, const int value) {
       interface->setFoo(id, value);
    }
    
    bool Schnittstelle::getFoo(const int id, int& value) {
       return interface->getFoo(id, value);
    }
    

    Da mir Performanz wichtig ist, habe ich dazu zwei Fragen:

    1. Macht es Sinn die Funktionsaufrufe als inline zu deklarieren? Oder würde der Compiler das eh selbst effizient umgestalten?

    2. Ich habe irgendwo mal gelesen, dass die Parameter-Übergabe als Referenz für skalare Datentypen eher mehr Aufwand mit sich bringt, als wenn der Parameter kopiert wird. Konkret: eher setFoo(int& id, int& value) oder wie oben?

    Freue mich auf eure Antworten ...



    1. Soweit ich weiß sollte das der Compiler (wenn Optimierungen aktiviert sind) automatisch inlinen wenn es was bringt, ebenso kann er das inline-Keyword einfach ignorieren wenn er das für effizienter hält.

    2. Ich würde es nicht als Referenz übergeben. Wenn du mal einen int betrachtest werden sagen wir mal 4Byte kopiert. Die Adresse ist (auf x86) genauso groß, insofern gibt sich das nichs.
      Es wäre was Anderes wenn ein Objekt übergeben würde, da ist der Kopiervorgang vergleichsweise teuer.

    Ich würde mir an deiner Stelle nicht so viele Gedanken um Performance machen,
    solange deine Anwendung nicht absolut zeitkritisch ist kannst du dir solche Mikrooptimierungen sparen, das ändert praktisch eh nichts 😉



  • Das Schlüsselwort inline ist heutezutage nur noch dafür da, um Mehrfachdefinitionen zu verhindern, da man eine Funktion inklusive Definition in eine Headerdatei packen kann.

    Zu den Calls-by-Reference: Man sagt, dass kleine Objekte per Value übergeben werden sollten anstatt per const-ref. Zu kleinen Objekten zählt man die Grunddatentypen und vielleicht noch complex und ratio...


Log in to reply