hilfe : von c++ zu java



  • Optimizer schrieb:

    String mystring("hallo welt");
    

    Ist in Java gar kein gültiges Statement, da es nicht der Grammatik gehorcht, das wäre die einfachste Erklärung.

    Und selbst wenn es das wäre und analog C++ funktionieren würde, dann würde es keinen Sinn ergeben, da der Typ String eine Objektreferenz auf einen String bezeichnet, und diese hat keinen Konstruktor, der Strings annimmt. Eine äquivalente Konstruktion in C++ wäre sowas in der Art

    string *myString("hallo Welt");
    

    und das ist ja auch Unsinn.



  • Ich weiss was Referenzen sind 😉
    Aber warum können diese in Java null sein ?
    Hm, bräuchte man sonst Pointer ? 🤡

    Pointer sind nach allgemeinem Verständnis Variablen, die Adressen enthalten. Das trifft auf die Referenzen in Java nicht unbedingt zu. Es ist nicht unüblich, Referenzen Pointer auf Pointer auf das Objekt sein zu lassen. Ich habe aber nicht nachgeschaut, wie es bei der Sun VM ist. Es muss auf jeden Fall kein Pointer sein. Außerdem verbindet man mit dem Begriff Pointer Sachen wie Basis-Adresse, Offset, alles Dinge, die dem Java-Programmierer nicht direkt zugänglich sind. Warum soll eine Referenz nicht null sein können? Nur weil es in C++ halt gerade nicht so ist?

    Ach komm, du scheinst zu viel Java programmiert zu haben und gar nicht mehr zu wissen wie man mit Pointern in C++ umgeht. Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Es gibt aber auch Pointer die auf ganz einfache Objekte zeigen. Diese sind entweder NULL, zeigen auf ein Objekt oder auf ein ehemaliges Objekt. Letztere sind entweder zu Recyceln oder zu Zerstören direkt nach ihrer Entstehung. Das Argument, dass Java Referenzen nicht in die Pampa zeigen können gilt nicht : Wenn man sich nicht um solche Referenzen kümmert wird der GC den Speicher nicht recyceln können.

    Also fassen wir mal zusammen : C++ Pointer können NULL sein, auf ein Objekt zeigen und müssen nach ihrem Gebrauch beseitigt werden, Java Referenzen können null sein, auf ein Objekt zeigen und müssen nach ihrem Gebrauch beseitigt werden. Hört sich für mich irgendwie nach dem gleichen an.

    Hingegen, ist es garantiert, dass C++ Referencen immer fest mit einem Objekt verbunden sind was bei Java Referencen nicht der Fall ist.

    Die Tatsache, dass Pointer in C++ und Java Referenzen wegen der unterschiedlichen Speicherverwaltung anders implementiert sind, ist ein Implementierungsdetail, das den Benutzer der Klassen "C++" und "Java" nichts angeht.

    Fals du mir nicht glauben solltest:

    The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.

    http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1



  • Optimizer schrieb:

    phlox81 schrieb:

    - Vermeide lokale Variablen in Java, da ja nur der GC diese wieder Zerstören kann

    Uneindeutig und unwichtig. Lokale Variablen sind entweder vom Typ int, short, char, byte, long, float, double oder < Referenz > und die die Referenz wird dann zerstört wenn der Stack Frame abgebaut wird. Was du natürlich meinst, sind die Objekte auf dem Heap. Du denkst aber fälschlicherweise, dass der GC große Schwierigkeiten damit hätte, viele kurzlebige Objekte zu zerstören. Wenn man weiß, wie der GC arbeitet, weiß man auch, dass die Arbeit des GC dafür gegen null geht. Schlimm sind Objekte, die mittel-lang leben.

    Wo kann man mehr ueber die Arbeitsweise des GC erfahren? 🙂



  • Blue-Tiger schrieb:

    Wo kann man mehr ueber die Arbeitsweise des GC erfahren? 🙂

    So auf die Schnelle habe ich nur folgendes gefunden. Da steht aber vermutlich schon einiges drin:

    http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html



  • Irgendwer schrieb:

    Ach komm, du scheinst zu viel Java programmiert zu haben und gar nicht mehr zu wissen wie man mit Pointern in C++ umgeht. Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Wenn man keine Ahnung hat...
    Habe ich irgendwas von Arrays gesagt? Ein Pointer in C++, so wie du ihn wahrscheinlich öfters mal benutzt, zeigt auf die Basisadresse eines Objekts und die einzelnen Datenelemente sind offset. Einfache Pointerarithmetik. Du hast zu wenig maschinennah programmiert, vielleicht in dem Maße, wie ich zu viel Java programmiert habe, oder mehr. Achso, es ist ja völlig falsch, was haben Pointer schon mit Adressen zu tun??

    Es gibt aber auch Pointer die auf ganz einfache Objekte zeigen. Diese sind entweder NULL, zeigen auf ein Objekt oder auf ein ehemaliges Objekt.

    Alles uninteressant. Interessiert den Pointer gar nicht, was das ist.
    Vielleicht wird dir so der Unterschied klar:
    Pointer in C++ oder einer maschinennahen Sprache: 0x2ee37c22
    Referenzen in Java: Objekt #632 oder null
    Der Pointer zeigt auf eine Basisadresse, die Referenz kann intern als Pointer repräsentiert werden, muss aber nicht. Kann völlig anders sein. Kann eine Objekt-ID sein. Kann ein Array-Index sein, wo der wahre Pointer gespeichert ist. Hat Vorteile bei der Implementierung des GC.

    Letztere sind entweder zu Recyceln oder zu Zerstören direkt nach ihrer Entstehung. Das Argument, dass Java Referenzen nicht in die Pampa zeigen können gilt nicht : Wenn man sich nicht um solche Referenzen kümmert wird der GC den Speicher nicht recyceln können.

    Deshalb zeigen sie noch lange nicht in die Pampa. 🙄

    Also fassen wir mal zusammen : C++ Pointer können NULL sein, auf ein Objekt zeigen und müssen nach ihrem Gebrauch beseitigt werden, Java Referenzen können null sein, auf ein Objekt zeigen und müssen nach ihrem Gebrauch beseitigt werden. Hört sich für mich irgendwie nach dem gleichen an.

    Ja, weil du mir gerade erzählt hast, wie du Java-Referenzen und C++-Pointer benutzt. Du hast weder gesagt, was sie sind, noch dass man mit C++-Pointern noch andere Dinge anstellen kann. Mir ehrlich gesagt vollkommen egal, ob du glaubst, dass es das selbe ist. Es ist mir ungefähr so egal wie Vera am Mittag.

    Hingegen, ist es garantiert, dass C++ Referencen immer fest mit einem Objekt verbunden sind was bei Java Referencen nicht der Fall ist.

    Weiß ich doch. Was hat das mit dem Thema zu tun? Ich habe diese beiden Arten von Referenzen nie verglichen.

    Die Tatsache, dass Pointer in C++ und Java Referenzen wegen der unterschiedlichen Speicherverwaltung anders implementiert sind, ist ein Implementierungsdetail, das den Benutzer der Klassen "C++" und "Java" nichts angeht.

    Das entscheidest also du, ob mich das was angeht? Wenn du mir sagen willst, dass diese beiden Dinge das selbe sind, halte ich dich nicht davon ab, das zu glauben. Mir wirklich sehr egal, was du glaubst. Aber du schreibst mir nicht vor, was mich zu interessieren hat. 🤡

    Gregor@Home schrieb:

    Genau! Damals wie heute. 😃 Optimizer redet so oft Stuss. Sicherlich fast genauso oft wie ich. Ob es jetzt um Primzahlen geht oder ob er die Nutzung eines Konstruktors empfiehlt, der so ziemlich der unnützeste Konstruktor ist, den es gibt

    Du hast mich mal wieder. 😞 🤡 👍



  • Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Übrigens: dass du NULL sagst, zeigt mir schon, dass du dich mit C++ nicht vollständig auskennst und mit dem Konzept des Überladen von Methoden nicht vertraut bist. Hast du dir schon mal überlegt, dass man foo(Auto*) und foo(int) haben kann? Weißt du was passiert, wenn du foo(NULL) aufrufst? Richtig, nicht das, was man vielleicht als erstes erwarten würde. Womit zweifelsfrei bewiesen wäre, dass du noch nie was vom Überladen von Methoden gehört hast. Einleuchtend, oder?



  • @Gregor: OMFG, hast du mal nachgeschaut, was der Copy-Konstruktor macht? Der kopiert tatsächlich den Buffer... Hilfe, ich bin blind. Er ist ja generell schon nicht sehr sinnvoll, aber man könnte irgendwie argumentieren "wenn jemand per reflection einen copy-ctor nutzen will...". Aber während Methoden wie substring() noch intelligent den Buffer sharen, wird hier tatsächlich Arraycopy bemüht...



  • Optimizer schrieb:

    @Gregor: OMFG, hast du mal nachgeschaut, was der Copy-Konstruktor macht? Der kopiert tatsächlich den Buffer... Hilfe, ich bin blind. Er ist ja generell schon nicht sehr sinnvoll, aber man könnte irgendwie argumentieren "wenn jemand per reflection einen copy-ctor nutzen will...". Aber während Methoden wie substring() noch intelligent den Buffer sharen, wird hier tatsächlich Arraycopy bemüht...

    Kannst ja einen RFE schreiben. Keine Ahnung, ob das arraycopy hier einen Sinn hat. Letztendlich arbeiten bei Sun auch nur Menschen. Da ist es schwer zu sagen, ob die sich dabei etwas gedacht haben, was man selbst nicht bedenkt, oder ob soetwas durch eine Nachlässigkeit entstanden ist. Sicherlich hat man auch mit der Zeit dazugelernt und ich halte es durchaus für wahrscheinlich, dass man so eine String-Klasse heute ganz ohne öffentlichen Konstruktor schreiben würde. Warum ist der eigentlich nicht deprecated?



  • Optimizer schrieb:

    Habe ich irgendwas von Arrays gesagt? Ein Pointer in C++, so wie du ihn wahrscheinlich öfters mal benutzt, zeigt auf die Basisadresse eines Objekts und die einzelnen Datenelemente sind offset.
    [...]
    Pointer in C++ oder einer maschinennahen Sprache: 0x2ee37c22
    Referenzen in Java: Objekt #632 oder null
    Der Pointer zeigt auf eine Basisadresse, die Referenz kann intern als Pointer repräsentiert werden, muss aber nicht.

    Jetzt zitierst du noch die Stelle im C++-Standard, wo das vorgeschrieben ist, und alle sind glücklich :p

    Ansonsten ist die Diskussion gerade ziemlich schwachsinnig IMHO, denn es spricht überhaupt nichts dagegen, dass Java-Referenzen Pointer sind. Es würde alles noch genauso funktionieren. Der einzige greifbare Unterschied ist das Fehlen von Pointerarithmethik.



  • C++ kann leider keine Null-Pointer Arithmethik 😞



  • Bashar schrieb:

    denn es spricht überhaupt nichts dagegen, dass Java-Referenzen Pointer sind. Es würde alles noch genauso funktionieren.

    Ausgangspunkt war

    Optimizer schrieb:

    Pointer sind nach allgemeinem Verständnis Variablen, die Adressen enthalten. Das trifft auf die Referenzen in Java nicht unbedingt zu.

    Ich habe nicht ausgeschlossen, dass Referenzen als Pointer implementiert sind. Das es nicht so sein muss, kann man aber ruhig sagen. Fakt ist, du weißt als Programmierer nicht, was eine Referenz ist, es kann beliebig gemacht werden. Wir hatten den Punkt mit dem GC schon einmal. Objekte zu verschieben erfordert entweder die Anpassung aller Pointer oder eines Pointers, wenn Referenzen Pointer auf Pointer sind. Bedenke, dass der GC in den wenigstens Fällen full collections macht und damit alle Pointer durchläuft. Er muss entweder wissen, was es alles für Pointer auf jedes Objekt gibt, oder er ändert einen Pointer-Pointer einfach ab. Es gibt Vor- und Nachteile bei beiden Systemen und Java schreibt nicht vor, was gemacht wird (außer du zitierst die Stelle in der Java vm specification 😉 ).

    Da du die obere Stelle mitzitiert hast, bist du wohl auch der Meinung, dass,

    Irgendwer schrieb:

    du scheinst zu viel Java programmiert zu haben und gar nicht mehr zu wissen wie man mit Pointern in C++ umgeht. Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Natürlich mag es schon sein, dass nicht immer der Zugriff auf Elemente exakt so implementiert ist, wie ich kurz angedeutet habe, aber darf ich denn kein Beispiel mehr geben, wo der Wert eines Pointers als Basisadresse benutzt wird?



  • Wieso "leider"?



  • Optimizer schrieb:

    Ausgangspunkt war

    Optimizer schrieb:

    Pointer sind nach allgemeinem Verständnis Variablen, die Adressen enthalten. Das trifft auf die Referenzen in Java nicht unbedingt zu.

    Ja, aber warum die ganze Aufregung? Das ist doch im Grunde das gleiche. Oder sollte zumindest in der Anschauung so sein, denn wenn du bei Pointern immer gleich die Adressen vor Augen hast, machst du dir die Abstraktion kaputt und belegst unnötig Gehirnkapazität.



  • llf schrieb:

    C++ kann leider keine Null-Pointer Arithmethik 😞

    wie meinen?



  • Optimizer schrieb:

    Irgendwer schrieb:

    Ach komm, du scheinst zu viel Java programmiert zu haben und gar nicht mehr zu wissen wie man mit Pointern in C++ umgeht. Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Wenn man keine Ahnung hat...
    Habe ich irgendwas von Arrays gesagt? Ein Pointer in C++, so wie du ihn wahrscheinlich öfters mal benutzt, zeigt auf die Basisadresse eines Objekts und die einzelnen Datenelemente sind offset. Einfache Pointerarithmetik. Du hast zu wenig maschinennah programmiert, vielleicht in dem Maße, wie ich zu viel Java programmiert habe, oder mehr. Achso, es ist ja völlig falsch, was haben Pointer schon mit Adressen zu tun??

    Ich habe ja auch nicht gesagt, dass Pointer keine Adressen sind, lern doch lesen. Ich sagte, dass der der bei Pointer als allerstes an eine Basisadresse denkt welche man einen Offset hinzufügen muss keine Ahnung von Programmierung in C++ hat. In C++ sieht man nun einmal eine Folge von Bytes abstrakt als ein Objekt an und Datenelemente als Member. Wer dies nicht tut der kann auch gleich C oder ASM benutzen.

    Es gibt aber auch Pointer die auf ganz einfache Objekte zeigen. Diese sind entweder NULL, zeigen auf ein Objekt oder auf ein ehemaliges Objekt.

    Alles uninteressant.

    Sag ich ja, hast keine Ahnung von Objektabstraktion in C++.

    Interessiert den Pointer gar nicht, was das ist.
    Vielleicht wird dir so der Unterschied klar:
    Pointer in C++ oder einer maschinennahen Sprache: 0x2ee37c22
    Referenzen in Java: Objekt #632 oder null
    Der Pointer zeigt auf eine Basisadresse, die Referenz kann intern als Pointer repräsentiert werden, muss aber nicht. Kann völlig anders sein. Kann eine Objekt-ID sein. Kann ein Array-Index sein, wo der wahre Pointer gespeichert ist. Hat Vorteile bei der Implementierung des GC.

    Ja und das ändert natürlich alles in der Denkweise des Programmiere und ist natürlich ein völlig anderes Verfahren der Objektabstraktion.

    Deshalb zeigen sie noch lange nicht in die Pampa.

    Ne noch schlimmer : Man hat ein Speicherloch und es fliegt einem noch nicht mal um die Ohren.

    Du hast weder gesagt, was sie sind,

    Interessiert mich auch nicht und eigentlich geht es mich auch nichts an. Ein Pointer kann dereferenziert werden alles andere ist nicht die feine Art und muss als "hacken" und nicht als "programmieren" bezeichnet werden. Pointerarithmetik funktioniert nur bei Arraypointern und gehört eigentlich in das Interface des Arrays ist also ein C Relict.

    Übrigens: dass du NULL sagst, zeigt mir schon, dass du dich mit C++ nicht vollständig auskennst und mit dem Konzept des Überladen von Methoden nicht vertraut bist. Hast du dir schon mal überlegt, dass man foo(Auto*) und foo(int) haben kann? Weißt du was passiert, wenn du foo(NULL) aufrufst? Richtig, nicht das, was man vielleicht als erstes erwarten würde. Womit zweifelsfrei bewiesen wäre, dass du noch nie was vom Überladen von Methoden gehört hast. Einleuchtend, oder?

    Ne, eigentlich nicht. Dein Argument zeigt aber, dass du keine Ahnung von C++ hast denn hätte ich 0 geschrieben gäbe es das gleiche Problem. :p

    Natürlich mag es schon sein, dass nicht immer der Zugriff auf Elemente exakt so implementiert ist, wie ich kurz angedeutet habe, aber darf ich denn kein Beispiel mehr geben, wo der Wert eines Pointers als Basisadresse benutzt wird?

    Natürlich darfst du ein Beispiel geben, aber doch bitte eins das sich nicht unter Compilerhaube befindet. Ich sehe ich nicht wieso ein Compiler Objekte nicht wie folgt implementieren dürfte: (Pseudo code)

    vector<int>member_1_of_T;
    vector<char>member_2_of_T;
    vector<short>member_3_of_T;
    
    void T::foo(this){
      member_1_of_T[this] = 5;
      member_3_of_T[this] = 7;
    }
    

    Und selbst wenn du jetzt eine Stelle im Standard finden solltest welche ein Pointer als x86 virtuelle RAM Adresse ähnliches Gebilde bezeichnen sollte dann zitiere ich den Gummiparagraphen:

    [defns.well.formed] 1.3.14 wellformed program
    a C++ program constructed according to the syntax rules, diagnosable semantic rules, and the One Definition
    Rule (3.2).

    Das heißt du musst auch noch ein Beispielprogramm zeigen, das sämtlichen Regeln des Standard entspricht und trotzdem bei der obigen Implementierung Scheiße baut. Da die Speicherauslegung von Objekten absolut nicht vorgeschrieben ist wird es schwierig werden zu beweisen, dass Member durch Offsets und Basispointer adressiert werden müssen.



  • Irgendwer schrieb:

    Deshalb zeigen sie noch lange nicht in die Pampa.

    Ne noch schlimmer : Man hat ein Speicherloch und es fliegt einem noch nicht mal um die Ohren.

    Ich diskutiere bestimmt nicht darüber, ob es besser ist, wenn ein Zeiger auf ein gelöschtes (und damit ungültiges) Objekt zeigen kann, oder wenn er immer auf ein gültiges Objekt zeigt. Aus zwei Gründen: es ist vollkommen klar was besser ist, insbesondere, weil ein Programm eben nicht immer abstürzt, wenn man den Zeiger dereferenziert. Und zweitens, weil ich genau das Thema vermeiden will, weil das wieder damit endet, dass entweder C++ oder Java die bessere Programmiersprache sein muss.

    Übrigens: dass du NULL sagst, zeigt mir schon, dass du dich mit C++ nicht vollständig auskennst und mit dem Konzept des Überladen von Methoden nicht vertraut bist. Hast du dir schon mal überlegt, dass man foo(Auto*) und foo(int) haben kann? Weißt du was passiert, wenn du foo(NULL) aufrufst? Richtig, nicht das, was man vielleicht als erstes erwarten würde. Womit zweifelsfrei bewiesen wäre, dass du noch nie was vom Überladen von Methoden gehört hast. Einleuchtend, oder?

    Ne, eigentlich nicht. Dein Argument zeigt aber, dass du keine Ahnung von C++ hast denn hätte ich 0 geschrieben gäbe es das gleiche Problem. :p

    Nein, gäbe es nicht, weil bei foo(0) klar ist, dass foo(int) aufgerufen wird. Außerdem sollte die Folgerung, dass du deshalb kein Overloading kennst nur genauso absurd sein, wie deine, dass ich, weil einmal Basisadresse in den Mund genommen habe, keine Ahnung von C++ habe. Das hast du aber nicht offenbar nicht bemerkt und es stattdessen weiter oben (nicht zitiert) weiterhin mindestens 3mal behauptet. Mehr noch, du hast behauptet

    Schon allein die Tatsache, dass du den Begriff "Pointer" mit Begriffen wie "Basis-Adresse" oder "Offset" assoziierst zeigt doch schon, dass alle Pointer für dich gleich Pointer auf Arrays sind.

    Ich habe es aber eigentlich nicht nötig, mich rechtzufertigen und Dinge abzustreiten, die einfach unsachlich und unbegründet in den Raum gestellt werden, oder gar das Gegenteil zu beweisen. Daher: </Diskussion>



  • Ausserdem ist Java langsamer als C++.



  • Aus zwei Gründen: es ist vollkommen klar was besser ist, insbesondere, weil ein Programm eben nicht immer abstürzt, wenn man den Zeiger dereferenziert.

    Na wenn man das so absolut sagen kann bin ich ja beruhigt. Es ist ja klar, dass es besser ist dass ein Zeiger auf veralteten Müll zeigt als in die Pampa.

    Ich habe es aber eigentlich nicht nötig, mich rechtzufertigen und Dinge abzustreiten, die einfach unsachlich und unbegründet in den Raum gestellt werden, oder gar das Gegenteil zu beweisen. Daher: </Diskussion>

    Ich verstehe dich, es ist ja auch schwer zu begründen, dass ein Zeiger kein Zeiger ist.



  • meinung schrieb:

    Ausserdem ist Java langsamer als C++.

    Huuh... Dabei dachte ich immer, das wäre andersrum. Jetzt bin ich ja ganz entsetzt. 😮 🙂



  • meinung schrieb:

    Ausserdem ist Java langsamer als C++.

    Das Stimmt !!!
    Java ist definitiv langsamer.
    Nur wen interressiert das ?
    Mein Rechner hat 2.x GHz, und evtl. noch 2 Threads gleichzeitig dank Intel...
    Kommerziell gesehen, ist das KEIN Argument.
    Da zählt mehr Entwicklungszeit usw. Eclipse für Java ist
    zwar 'langsam' aber brauchbar. Ich verlier pro Tag vielleicht
    durch Java in Eclipse 5 min, aber dafür gewinn ich auch wieder
    Zeit durch Plugins...
    C++ mag 5% schneller sein, Java ist aber eine Plattform,
    d.h. ich kann unter XP entwickeln, und es dann unter Linux laufen lassen,
    ist doch egal, ist ja Java. In C++ müsste ich erstmal neu kompilieren.
    Sicher wäre dann C++ schneller, aber wo hab ich einen Rechner zum compilieren ? 🙄
    In Java pack ich es einfach in eine Jar Datei, und fertig, läuft immer
    auf der VM, wo, hm, das kann mir egal sein.
    Desktops sind heute häufig noch Windows (XP/2000/NT/98),
    Server eher Unix/Linux.

    Und wenn ich beides haben möchte, nehm ich .net.
    Mit Mono existiert eine Implementation für nicht Windows
    die schon weiter ist, als der Release von MS, und 100%
    kompatibel.

    phlox


Anmelden zum Antworten