Wertübergabe vs. Referenzübergabe bei primitiven Typen



  • Hi,

    ich habe vorhin in einem anderen Thread folgende Methode gepostet. [ http://www.c-plusplus.net/forum/294088 ]

    int operator()(const int& i)
    {
        return i*i;
    }
    

    Im Nachhinein denke ich nun, dass meine gewählte Art der Parameterübergabe irgendwie Schwachsinn ist. Es wird zwar keine Kopie erstellt, aber eine Referenz benötigt (bei mir) 4Byte und ist damit ungefähr gleich groß wie jeder primitive Typ und muss zusätzlich auch noch immer dereferenziert werden. Kann man also als Faustregel sagen, dass sich die Referenzübergabe bei primitiven und kleinen komplexen Typen nicht auszahlt?

    Falls ja, würdet ihr dann im Folgenden das const auch noch weglassen?

    int operator()(const int i)
    {
        return i*i;
    }
    

    lg

    edit:

    const in pass-by-value is indeed redundant. The function can't make changes to the original variable anyway, because it has a local copy thereof. Now one can argue that even in that case, the use of const documents the fact that the function doesn't change its local copy. However, do we really care about this? If you are the implementer of the function, you probably do but you certainly don't need to document this fact, as it is merely an implementation detail, not a part of the interface. Users of this function certainly don't care; all they need to know is that the original variable can't be altered, and the use of pass-by-value, with or without const, already guarantees that. To conclude, the use of const in pass-by-value is an example of over-specification that exposes an implementation detail. In general, exposing implementation details is bad object-oriented programming practice.



  • Gugelmoser schrieb:

    Kann man also als Faustregel sagen, dass sich die Referenzübergabe bei primitiven und kleinen komplexen Typen nicht auszahlt?

    Ja, das ist eine gute Faustregel.
    PS:
    ich nehme mir sizeof() als Hilfe fuer die Faustregel. Wenn das Objekt kleiner gleich 8 Byte ist, dann per Value, sonst by Reference.
    Aber das ist nicht in Stein gemeiselt sondern nur eine Faustregel.

    Falls ja, würdet ihr dann im Folgenden das const auch noch weglassen?

    Ja. Es bringt keinen Vorteil und ist somit zusaetzliche nichtssagende Information. Und solche will man meiden.



  • Shade Of Mine schrieb:

    Falls ja, würdet ihr dann im Folgenden das const auch noch weglassen?

    Ja. Es bringt keinen Vorteil und ist somit zusaetzliche nichtssagende Information. Und solche will man meiden.

    Hmm, wie weiß ich denn, wann etwas eine zusätzlich sinnvolle Information ist und wann nicht? Wieso ist nun z.B. bei einem Copy-Konstruktor das const eine sinnvolle Zusatzinformation?



  • Du musst unterscheiden zwischen const T und const T& bzw. const T* .

    Bei ersterem spricht man auch von Top-Level-CV-Qualifizierer, da das Objekt direkt auf oberster Ebene als konstant markiert wird. Das macht bei der Deklaration keinen Sinn, da es sich ohnehin um eine Kopie (Pass by Value) handelt. Dem Aufrufer wird dadurch nichts mitgeteilt.

    Bei der zweiten und dritten Variante werden hingegen Objekte, auf die ein Zeiger oder eine Referenz verweist, als konstant gekennzeichnet. Das ist sehr wohl sinnvoll, da der Aufrufer so die Sicherheit hat, dass sein Original-Objekt nicht verändert wird.



  • danke euch 😉


Log in to reply