sahib: Zeiger vs. referenz

hey,
kann mir jemand sagen, was schneller ist und warum ?!

Danke,
sahib

  1. Hi,

    ist ein Zeiger nicht nur eine andere Bezeichnung für Referenz? In C spricht man von Zeigern, in PHP von Referenz, da es dort keine "echten" Zeiger im ursprünglichen Sinne gibt und in Perl spricht man auch von Referenz, wobei die da eher vergleichbar mit klassischen Zeigern sind und so durchaus auch als Zeiger bezeichnet werden können. Alles in allem müßten diese in allen Sprachen (sofern sie dort existieren) nahezu gleiche Verhaltensweisen und Performance haben. Diese Angaben jedoch ohne Gewähr, da ich mir nicht sicher bin.

    MfG
    Danny

    1. Hi,

      ist ein Zeiger nicht nur eine andere Bezeichnung für Referenz? [...]

      ebenfalls synonym (zumindest meist; einige Sprachen definieren Unterschiede[1]) ist Pointer.

      Cheatah

      [1] Und Java hat keine Pointer, daher auch die NullPointerException.

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. ist ein Zeiger nicht nur eine andere Bezeichnung für Referenz?
        Und Java hat keine Pointer, daher auch die

        widersprecht Ihr Euch nicht gerade?!

        1. Hi,

          widersprecht Ihr Euch nicht gerade?!

          nö. Die Philosophien mancher Sprachen widersprechen sich.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. ist "call by reference" oder "call by value" schneller?

            1. Hi,

              ist "call by reference" oder "call by value" schneller?

              ersteres.

              Gruss,
              Ludger

            2. Hi,

              ist "call by reference" oder "call by value" schneller?

              in Java ist die Referenz der Value. Möchtest Du nicht vielleicht erst mal sagen, von welcher Sprache Du eigentlich redest?

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
              1. in Java ist die Referenz der Value. Möchtest Du nicht vielleicht erst mal sagen, von welcher Sprache Du eigentlich redest?

                ????
                wovon redest du ???

                1. Hi,

                  wovon redest du ???

                  Dass in Java _technisch immer_ pass-by-value stattfindet.

                  Viele Grüße,
                  Martin

                  1. wovon redest du ???
                    Dass in Java _technisch immer_ pass-by-value stattfindet.

                    danke für die übersetzung.

                    also das argumente defaultmäßig als kopie des wertes (by value) übergeben werden, aus sicherheitsgründen.

                    das machen andere ja auch, wenn es sich um primitive datentypen handelt.

                    wie siehts bei objekten aus?

                    1. Hi,

                      wie siehts bei objekten aus?

                      die Zeiger/Pointer/Referenzen werden als Kopie übergeben (sprich: vereinfacht wird die "Einsprungadresse" des referenzierten Zielobjekts kopiert und übergeben).**

                      Viele Grüße,
                      Martin

                      **: Kann zwischen verschiedenen VM-Implementierungen unterschiedlich sein.

                      1. wie siehts bei objekten aus?
                        die Zeiger/Pointer/Referenzen werden als Kopie übergeben (sprich: vereinfacht wird die "Einsprungadresse" des referenzierten Zielobjekts kopiert und übergeben).**

                        sinnvollerweise wird eine neue referenz erstellt (eine kopie des pointers), damit die originalreferenz auf keinen fall zerschossen werden kann.

                        aber es wird keinesfalls die datenstruktur kopiert. dies würde nicht nur die performance bremsen, sondern auch datenmanipulationen der betreffenden objekte unterbinden, da diese ja in der kopie erfolgen. deshalb übergibt php5 jetzt defaultmäßig als referenz und nicht mehr als kopie.

                        bei primitiven datentypen spielt performance keine rolle. daher können die by value übergeben werden.

                        1. Hi,

                          die Zeiger/Pointer/Referenzen werden als Kopie übergeben (sprich: vereinfacht wird die "Einsprungadresse" des referenzierten Zielobjekts kopiert und übergeben).**
                          sinnvollerweise wird eine neue referenz erstellt (eine kopie des pointers), damit die originalreferenz auf keinen fall zerschossen werden kann.

                          Das ist eine Widerholung dessen, was ich vorher schrieb ;-)
                          Die Begründung (auch für das Verhindern eines "Zerschießens") ist einfach: Methodenparameter sind lokale Variablen und damit nur im Scope der Methode und _nicht_ außerhalb gültig. Daher müssen die übergebenen Referenzen Kopien sein.

                          aber es wird keinesfalls die datenstruktur kopiert.

                          ist mir durchaus bekannt ;-)

                          dies würde nicht nur die performance bremsen, sondern auch datenmanipulationen der betreffenden objekte unterbinden, da diese ja in der kopie erfolgen. deshalb übergibt php5 jetzt defaultmäßig als referenz und nicht mehr als kopie.

                          Ähm, wir sprachen zumindest bis hierhin von Java, welches eine (fast) perfekte Implementierung des OO-Paradigmas ist.

                          bei primitiven datentypen spielt performance keine rolle.

                          Das hängt sicherlich auch von der Implementierung des Konzepts "primitiver Datentypen" ab.

                          daher können die by value übergeben werden.

                          S.o.

                          Viele Grüße,
                          Martin

                          1. klar ist das alles bekannt.
                            mit php5 war nur so am rande bemerkt.

                            hier gehts ja auch nicht um schlaumeierei, obwohl man das manchmal glauben mag.

                            der fragesteller fragte nach: Zeiger vs. referenz
                            kann mir jemand sagen, was schneller ist und warum ?!

                            ich denke, anhand der diskussion kann er sich die antwort nun selbst geben.

                            1. Hi,

                              hier gehts ja auch nicht um schlaumeierei, obwohl man das manchmal glauben mag.

                              Uuups, ich hoffe, meine Antworten werden nicht als solche empfunden. Wenn sie manchmal etwas ausführlicher (und evtl. dezidierter sind), dann auch mit dem Ziel, mein Wissen in einem öffentlichen Raum auf die Probe zu stellen.

                              der fragesteller fragte nach: Zeiger vs. referenz
                              kann mir jemand sagen, was schneller ist und warum ?!

                              Das war mir in der Zwischenzeit bereits wieder entfallen ;-)

                              Viele Grüße,
                              Martin

                              1. hier gehts ja auch nicht um schlaumeierei, obwohl man das manchmal glauben mag.
                                Uuups, ich hoffe, meine Antworten werden nicht als solche empfunden. Wenn sie manchmal etwas ausführlicher (und evtl. dezidierter sind), dann auch mit dem Ziel, mein Wissen in einem öffentlichen Raum auf die Probe zu stellen.

                                damit warst du auch nicht gemeint !!

            3. Generell ist logischerweise "call by reference" schneller, da intern kein Wert kopiert werden muß.

      2. [1] Und Java hat keine Pointer, daher auch die NullPointerException.

        wie der name null-pointer exception schon sagt, handelt es sich hier um eine ausnahme, weil der pointer null ist, also keine adresse auf einen gültigen speicherbereich hat.

        selbstverständlich hat java so wie alle anderen programmiersprachen auch, zeiger, pointer oder referenzen etc. auf speicherbereiche.

        1. Hi,

          selbstverständlich hat java so wie alle anderen programmiersprachen auch, zeiger, pointer oder referenzen etc. auf speicherbereiche.

          Selbstverständlich verwendet eine Java-VM-Implementierung (intern!) ein Zeigerkonzept.
          Die Spezifikation sagt auch "The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object....." (4.3.1).
          Konzeptionell wird jedoch ausschließlich von Referenzen gesprochen, die zu den "safe constructs" dieser Sparache zählen - im Gegensatz zum 'klassischen' Verständnis von Pointern mit ihren Vor-/Nachteilen (Pointerarithmethik etc.).
          Konsequenterweise hätte die Ausnahme-Klasse daher besser als NullReferenceTargetException o.ä. bezeichnet werden sollen.

          Viele Grüße,
          Martin

        2. Hi,

          [1] Und Java hat keine Pointer, daher auch die NullPointerException.
          wie der name null-pointer exception schon sagt, handelt es sich hier um eine ausnahme, weil der pointer null ist,

          wenn Du einem Java-Freund sagst, der Pointer sei Null, wird er Dir empört sagen, dass es in Java keine Pointer gibt, also auch keiner Null sein kann. Keiner dieser Java-Freunde konnte mir bisher allerdings erklären, wo denn der Unterschied zwischen einem Pointer und einer Referenz läge, so dass Java zwar das eine aber nicht das andere besitzt. Und warum es trotzdem NullPointerException heißt, konnte ebenfalls keiner sagen. Aber es ganz ganz wichtig, dass es in Java keine Pointer gibt, so viel ist sicher[tm].

          selbstverständlich hat java so wie alle anderen programmiersprachen auch, zeiger, pointer oder referenzen etc. auf speicherbereiche.

          Richtig[1] - oder :-)

          Cheatah

          [1] Nun ja, dass _alle_ Programmiersprachen Pointer o.ä. besitzen, ist sicherlich falsch.

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Hi,

            wenn Du einem Java-Freund sagst, der Pointer sei Null, wird er Dir empört sagen, dass es in Java keine Pointer gibt, also auch keiner Null sein kann. Keiner dieser Java-Freunde konnte mir bisher allerdings erklären, wo denn der Unterschied zwischen einem Pointer und einer Referenz läge.

            Wie wäre es mit:
            Eine Referenz in Java ist im Gegensatz zum althergebrachten Zeiger-Konzept ein "ImmutablePointer", der von der Laufzeitumgebung zwecks Objektmanipulation zur Verfügung gestellt wird?

            Und warum es trotzdem NullPointerException heißt,

            Siehe meinen Kommentar im Schwester-Posting zu Deinem Beitrag.

            Viele Grüße,
            Martin

            1. Hi,

              Wie wäre es mit:
              Eine Referenz in Java ist im Gegensatz zum althergebrachten Zeiger-Konzept ein "ImmutablePointer", der von der Laufzeitumgebung zwecks Objektmanipulation zur Verfügung gestellt wird?

              ich kenne Leute, die jetzt wieder aufschreien würden, weil es damit immer noch ein Pointer ist ;-) Allerdings muss ich gestehen, dass es mir persönlich recht egal ist, ob es in Java nun Pointer gibt oder nicht - Hauptsache ich weiß, wie sie funktionieren.

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
              1. Hi,

                ich kenne Leute, die jetzt wieder aufschreien würden, weil es damit immer noch ein Pointer ist ;-)

                Ach ja - die allgegenwärtigen Haarspalter ohne Praxisbezug (nein, ich meine nicht nur Menschen mit Glatze..).

                Allerdings muss ich gestehen, dass es mir persönlich recht egal ist, ob es in Java nun Pointer gibt oder nicht - Hauptsache ich weiß, wie sie funktionieren.

                D'accord.

                Viele Grüße,
                Martin

          2. selbstverständlich hat java so wie alle anderen programmiersprachen auch, zeiger, pointer oder referenzen etc. auf speicherbereiche.

            Richtig[1] - oder :-)

            [1] Nun ja, dass _alle_ Programmiersprachen Pointer o.ä. besitzen, ist sicherlich falsch.

            ALLE besitzen pointer. nur die benutzung geht nicht immer nur von einer seite (programmierer oder system) aus.

            es gibt explizite pointer in einer sprache, welche vom programmierer verwaltet werden können.

            die impliziten pointer sieht man nicht. wie oft ist wohl die zeichenkette 'willi ist doof' im hauptspeicher zu sehen, wenn ich diesen string zig mal ins programm schreibe?

            als modernes konzept, welches die fehler der vergangenheit beseitigen möchte, hat java natürlich keine explizite pointerei.

  2. kann mir jemand sagen, was schneller ist und warum ?!

    der unterschied von ZEIGER und REFERENZ ?

    hierzu sollte man erst einmal klären, was jeder der begriffe bedeuten soll.

    ein ZEIGER ist idr. eine speicherstelle, welche eine adresse auf eine andere speicherstelle hat.
    wer mal assembler programmiert hat, kennt 'displacements', mit welchen oft eine datenstruktur definiert wird, ohne konkret speicher zu reservieren. für die reale datenstruktur wird dann speicher besorgt und die startadresse in z.b. ein register gesetzt. mit der relativen adressierung wird dann die datenstruktur angesprochen.
    freigeben muß ich diesen speicher selbst.

    eine REFERENZ ist ein begriff aus höheren programmiersprachen. hier kümmert sich der compiler oä. darum, ob es noch referenzen gibt, und gibt den speicherbereich frei.
    es können ja mehrere referenzen auf den selben speicher existieren.

    das prinzip ist das gleiche, aber die verwaltung übernimmt der compiler.

    1. Hi,

      das prinzip ist das gleiche, aber die verwaltung übernimmt der compiler.

      Das trifft für Java _nicht_ zu.

      Viele Grüße,
      Martin

      1. das prinzip ist das gleiche, aber die verwaltung übernimmt der compiler.
        Das trifft für Java _nicht_ zu.

        7.8.3 Zeiger
        Java braucht keine Zeiger, werden vollständig ersetzt durch Zeigersemantik nicht-primitiver Datentypen;
        Vorteil: alle Risiken von Zeigern ausgeschlossen (Zeigerarithmetik, Typumwandlung zwischen unverträglichen Zeigertypen, Zugriff über undefinierte Zeigerwerte);

        Zeiger existieren mittelbar in Java, unterliegen aber strengen Einschränkungen;

        Abwesenheit von Zeigern Voraussetzung für Garbage collection;

        7.8.4 Null-Objekt

        1. Hi fk,

          7.8.3 Zeiger
          Java braucht keine Zeiger, werden vollständig ersetzt durch Zeigersemantik nicht-primitiver Datentypen;
          Vorteil: alle Risiken von Zeigern ausgeschlossen (Zeigerarithmetik, Typumwandlung zwischen unverträglichen Zeigertypen, Zugriff über undefinierte Zeigerwerte);
          .....[einiges entfernet]

          was willst Du mir damit mitteilen?

          Ich sagte: Nicht der Compiler, sondern die Laufzeitumgebung ist für die Verwaltung der Pointer/Zeiger/Referenzen zuständig.

          Viele Grüße,
          Martin

          1. Ich sagte: Nicht der Compiler, sondern die Laufzeitumgebung ist für die Verwaltung der Pointer/Zeiger/Referenzen zuständig.

            ich meinte auch nicht den compiler. dessen arbeit ist ja was anderes. aber compiler meint auch, daß die notwendigen routinen in die ausführbare datei eingebunden werden, und steht daher im sprachgebrauch für die services der systemumgebung.

            1. Hi,

              ich meinte auch nicht den compiler. dessen arbeit ist ja was anderes. aber compiler meint auch, daß die notwendigen routinen in die ausführbare datei eingebunden werden, und steht daher im sprachgebrauch für die services der systemumgebung.

              Ich weiß nicht, was Du in diesem Zusammenhang unter "notwendigen routinen" verstehst. Ich vermute, Du meinst all die "Funktionen", die in Java für das Reference-Handling benötigt werden. Wenn Du das meintest, war meine vorherige Antwort richtig: Das macht alles "erst" die VM während des Ladens der Klassen bzw. danach.

              Viele Grüße,
              Martin

              1. ich meinte auch nicht den compiler. dessen arbeit ist ja was anderes. aber compiler meint auch, daß die notwendigen routinen in die ausführbare datei eingebunden werden, und steht daher im sprachgebrauch für die services der systemumgebung.
                Ich weiß nicht, was Du in diesem Zusammenhang unter "notwendigen routinen" verstehst. Ich vermute, Du meinst all die "Funktionen", die in Java für das Reference-Handling benötigt werden. Wenn Du das meintest, war meine vorherige Antwort richtig: Das macht alles "erst" die VM während des Ladens der Klassen bzw. danach.

                diese datailfuselei ist eigentlich völlig uninteressant.
                wie ich schon irgendwo erwähnte:
                entweder von hand: dann ist idr. von pointern die rede
                oder als service: dann spricht man idr. von referenz

                die java-vm macht nichts ohne dazu aufgefordert zu werden. sie hat ja kein 'eigenleben'.

                also: dort wo du im quelltext irgendwie den compiler nötigst, pointer anzulegen, (referenz) müssen diese ja verwaltet werden. deshalb baut der compiler an diesen stellen aufrufe für die entsprechenden routinen (in der java-vm) ein. diese werden dann zur laufzeit dort ausgeführt.
                wo dieser komfort (und sicherheit) nicht vorgesehen ist, muß der speicher selbst verwaltet werden. dort gibts dann die üblichen programmabstürze.

                1. Hi,

                  diese datailfuselei ist eigentlich völlig uninteressant.

                  warum diskutieren wir dann darüber? Abgesehen davon ist sie für mich interessant.

                  also: dort wo du im quelltext irgendwie den compiler nötigst, pointer anzulegen, (referenz) müssen diese ja verwaltet werden. deshalb baut der compiler an diesen stellen aufrufe für die entsprechenden routinen (in der java-vm) ein.

                  Welche "Routinen" meinst Du?
                  Natürlich ist im Bytecode die Information enthalten, dass in "Schritt 5 eine neue Referenz vom Typ X angelegt werden soll". That's it! Wie diese Referenz jetzt verwaltet wird, ist Sache der VM. D.h., die VM besitzt "Routinen", die diese Information entsprechend umsetzen (interpretieren).

                  Viele Grüße,
                  Martin

                  1. diese datailfuselei ist eigentlich völlig uninteressant.
                    warum diskutieren wir dann darüber? Abgesehen davon ist sie für mich interessant.

                    also: dort wo du im quelltext irgendwie den compiler nötigst, pointer anzulegen, (referenz) müssen diese ja verwaltet werden. deshalb baut der compiler an diesen stellen aufrufe für die entsprechenden routinen (in der java-vm) ein.
                    Welche "Routinen" meinst Du?
                    Natürlich ist im Bytecode die Information enthalten, dass in "Schritt 5 eine neue Referenz vom Typ X angelegt werden soll". That's it! Wie diese Referenz jetzt verwaltet wird, ist Sache der VM. D.h., die VM besitzt "Routinen", die diese Information entsprechend umsetzen (interpretieren).

                    Welche "Routinen" meinst Du?
                    die antwort hast du selbst gegeben.

                    sicherlich mag eine technische diskussion interessant sein. aber ich glaube, daß die fragesteller hier mehr an der praktischen lösung intereesiert sind.

                    was passiert wenn es keine referenzen mehr gibt? (garbage collection)

                    was passiert, wenn ohne systemunterstützung von hand pointer verwaltet werden und vergessen wird den speicher aufzuräumen?

                    1. Hi,

                      Welche "Routinen" meinst Du?
                      die antwort hast du selbst gegeben.

                      Ich sprach von Informationen (nicht Routinen) im Bytecode, anhand derer die/eine VM dann ihre entsprechenden "Routinen".... Du hast ja Recht bzgl. der Relevanz dieser Details......

                      was passiert wenn es keine referenzen mehr gibt? (garbage collection)

                      Dann sind sie weg ;-)

                      was passiert, wenn ohne systemunterstützung von hand pointer verwaltet werden und vergessen wird den speicher aufzuräumen?

                      Stop: Java ;-))

                      Viele Grüße,
                      Martin

        2. Hallo,

          Abwesenheit von Zeigern Voraussetzung für Garbage collection;

          Äh, inwiefern das?

          Tim

          1. Abwesenheit von Zeigern Voraussetzung für Garbage collection;

            Äh, inwiefern das?

            dies war ein zitat, welches nicht von mir kommt. da du dies so schon zerstückelt hast, mußte ich erst noch einmal den kontext nachlesen.

            ich denke es ist folgendermaßen gemeint:

            eine garbage collection darf nur erfolgen, wenn es keine zeiger mehr auf diesen speicher gibt.
            scheint auch logisch. was würde wohl passieren, wenn der speicher reorganisiert wird, aber die pointer unverändert bleiben?