native Typen



  • Hallo!

    In einem älteren Beitrag habe ich das gelesen:

    Unterschied ist hier, das es keine Diskussion geben kann, weil man int bzw. native Typen nicht als Ref über- oder zurückgibt

    Wieso macht man das nicht?(Wenn mich jetzt nicht alles täuscht habe ich so was schon sehr oft in C++ Büchern gesehen)
    Und, fällt unter native Typen auch ein String?

    MfG

    Dosunmu



  • Hi!

    Native Typen (PODs) sind char, float, int, double, byte, bool und was es da noch so an eingebauten Zahlentypen gibt. std::string ist eine normale Klasse und damit kein nativer Typ.
    Es bringt nichts die PODs als Referenz zu übergeben, weil die Größe eines Zeigers meist genauso groß ist wie ein POD und man damit keine Geschwindigkeit gewinnt. Das lohnt sich aber durchaus bei größeren Klassen mit vielen Membervariablen, weil die dann nicht alle kopiert werden müssen.

    KaPtainCugel



  • Das mit der Größe eines Typs ist doch eher ein Nebeneffekt. Ich übergebe dann eine Referenz, wenn ich eine Referenz haben will. D.h. DAS Objekt haben will, das mir der User übergibt. Im zweiten Schritt denke ich über die Objektgröße und den netten Nebeneffekt einer Ref nach. Aber ich gehe doch nicht zu erst von der Größe aus. Würde ich das tun, würde ich in schwere "Schwulitäten" geraten.

    Und somit: auch native Typen kann man bedenkenlos als Ref übergeben. Dann wenn ich eine Referenz auch haben will. Brauch ich keine Ref... dann nimm ich ne Kopie.



  • Wenn ich etwas an dem übergebenen Objekt ändern möchte, dann übergebe ich es als Pointer. Referenzen kommen bei mir nur als const-Referenzen vor, aber da ich weiß, dass es hier gleich in einen Glaubenskrieg ausartet, möchte ich es dabei belassen. Das ist einfach mein persönlicher Stil und jeder soll das so machen wie er es für richtig hält.



  • @dosunmu:
    Das was du da gelesen hast, war wahrscheinlich so gemeint, dass man keine nativen Typen per Referenz übergibt um einen Geschwindigkeits/Speicher-Vorteil zu erreichen, weil das im Endeffekt aufs gleiche rauskommt. Deshalb übergibt man native Typen normal immer by value. Wenn du es aber beabsichtigst z.B. einen integer zu übergeben, der innerhalb der Funktion geändert werden soll, dann machst du das natürlich auch per Referenz.
    Fazit: Je nachdem was gewünscht ist. Wenn etwas nach außen verändert werden soll, dann native Typen auch als Referenz, ansonsten by value (alleine schon auch um den Leser deines Codes nicht zu verwirren).
    Und ansonsten sollte man normalerweise eigentlich alles was nicht ein nativer Typ ist auch als const Referenz übergeben (vorrausgesetzt man will es nicht verändern, ansonsten halt ohne const). Pointer gehen natürlich genauso, ich benutze aber lieber Referenzen, da einfacher handzuhaben und das hier schließlich auch ein C++ Forum ist 😉



  • KPC schrieb:

    Hi!

    Native Typen (PODs) ...

    Sorry, aber es besteht ein Unterschied zwischen "nativen Typen" und "PODs":

    struct Beispiel {
      int i[10000];
      char s[500];
    };
    

    ist ein "POD" aber kein "nativer Typ" und sollte ruhig per Referenz übergeben werden, weil ein Beispiel bestimmt auf jeder Plattform größer ist als ein Beispiel* .

    Gruß,

    Simon2.



  • Simon2 schrieb:

    KPC schrieb:

    Hi!

    Native Typen (PODs) ...

    Sorry, aber es besteht ein Unterschied zwischen "nativen Typen" und "PODs":
    [..]

    So wie er es geschrieben hat stimmt es doch. Hätte er geschrieben PODs (native Typen) wäre dein Einwand berechtigt.



  • KPC schrieb:

    Native Typen (PODs) sind char, float, int, double, byte, bool und was es da noch so an eingebauten Zahlentypen gibt.

    UDTs können auch PODs sein. Den Satz kann man missverstehen.

    @dosunmu
    C++ verwendet Wert Semantik, also immer wenn etwas zugewiesen oder übergeben wird, wird kopiert und nicht einfach eine Referenz weitergegeben. Wenn man an eine Funktion nun ein Argument übergibt, was sehr gross bzw. aufwändig zu kopieren ist, kostet das unnötig Rechenzeit. Daher versucht man dies zu umgehen, und greift auf Zeiger oder Referenzen zurück. Aber wie Artchi schon sagte, die Aufgabe von Referenzen ist eigentlich eine andere und tritt hier nur als Nebeneffekt in Erscheinung. Bei nativen Typen (char, int, float, ...), oder wie sie der Standard nennt, "fundamental types", macht die Verwendung von Zeigern oder Referenzen hier jedoch keinen Sinn, da eine Kopie nichts kostet.



  • lolz schrieb:

    Simon2 schrieb:

    KPC schrieb:

    Hi!

    Native Typen (PODs) ...

    Sorry, aber es besteht ein Unterschied zwischen "nativen Typen" und "PODs":
    [..]

    So wie er es geschrieben hat stimmt es doch. Hätte er geschrieben PODs (native Typen) wäre dein Einwand berechtigt.

    Das meinte ich damit:

    groovemaster schrieb:

    KPC schrieb:

    Native Typen (PODs) sind char, float, int, double, byte, bool und was es da noch so an eingebauten Zahlentypen gibt.

    UDTs können auch PODs sein. Den Satz kann man missverstehen.

    Es klingt so (auch wenn er es vermutl. nicht so meint), als seien "nativer Typ" und "POD" Synonyme ... dabei meint er wohl, dass "nativer Typ" eine Untermenge von PODS sind.
    Ging mir nicht in erster Linie um Rechthaben, sondern um Klarstellung für "Dritte", die das in den falschen Hals bekommen könnten.

    Gruß,

    Simon2.


Anmelden zum Antworten