Warum hat Java eigentlich keine...



  • frager schrieb:

    Ist schneller und hat Wertsemantik (im Gegensatz zu Java, wo alles ausser Dingen wie etwa int Referenzsemantik hat)...

    In der Tat! Ich habe mal ein OBJ-Modelloader für eine OpenGL Anwendung geschrieben.
    Während ich in einer C++ Lösung einen riesigen zusammenhängenden Speicherbereich/Array für Strukturen anlegen konnte und somit sehr (wirklich sehr) viele Daten im Speicher bereits strukturiert halten konnte so war dies in Java nicht möglich. Java bietet zur Strukturierung nur Klassen, deren Objekte auf dem Heap allociert werden.

    Die einzige Lösungsmöglichkeiten war daher das Arbeiten mit Primitiven Datentypen (ohne Strukturierung).

    Java ist halt kein C++ und eignet sich nicht unbedingt für Anwendungen wo Speichermanagement eine Rolle spielt.



  • frager schrieb:

    ... Werttypen wie C# (System.ValueType, struct)? 😕

    Diesen Schrott braucht man nicht
    http://www.geocities.com/csharpfaq/structs.html



  • schrott____ schrieb:

    Diesen Schrott braucht man nicht
    http://www.geocities.com/csharpfaq/structs.html

    Das ist übrigens auch eine der wenigen Punkte die ich an C# misslungen finde (Nicht das es die Unterscheidung gibt, sondern das man es im Code nicht unterscheiden kann). Zudem fehlt mir die const-Kennzeichnung bei Übergabeparametern (Ich will wissen ob ein Methodenaufruf manipuliert oder nicht, um zu wissen ob ich unter Umständen kopieren muss, oder nicht).

    Aber das Problem in jeder Sprache ist, welche Kompromisse man eingeht. Es gibt durchaus Argumente gegen bestimmte Notationen...

    cu André



  • Während ich in einer C++ Lösung einen riesigen zusammenhängenden Speicherbereich/Array für Strukturen anlegen konnte und somit sehr (wirklich sehr) viele Daten im Speicher bereits strukturiert halten konnte so war dies in Java nicht möglich.

    Warum den das?

    Auf dem Heap kann man auch große Datenmengen ablegen. Um mehr Speicher anzufordern muss man die Option -Xmx benutzen.



  • ^^und zur (statischen) strukturierung reichen klassen völlig aus. man kann ja auch reine datenklassen anlegen, die die funktion von structs in C erfüllen. getter und setter weglassen, alles public machen und schon hat man seine C structs.
    🙂



  • ~fricky schrieb:

    alles public machen und schon hat man seine C structs.
    🙂

    Reference- versus Value-Semantik



  • Shade Of Mine schrieb:

    Reference- versus Value-Semantik

    mein posting bezieht sich auf die postings von linuxbie_logout und Jer, nicht auf die originalfrage.
    🙂



  • asc schrieb:

    schrott____ schrieb:

    Diesen Schrott braucht man nicht
    http://www.geocities.com/csharpfaq/structs.html

    Das ist übrigens auch eine der wenigen Punkte die ich an C# misslungen finde (Nicht das es die Unterscheidung gibt, sondern das man es im Code nicht unterscheiden kann). Zudem fehlt mir die const-Kennzeichnung bei Übergabeparametern (Ich will wissen ob ein Methodenaufruf manipuliert oder nicht, um zu wissen ob ich unter Umständen kopieren muss, oder nicht).

    Aber das Problem in jeder Sprache ist, welche Kompromisse man eingeht. Es gibt durchaus Argumente gegen bestimmte Notationen...

    cu André

    Darum kann man auch C++/CLI nehmen, dort wird unterschieden 😉



  • ~fricky schrieb:

    ^^und zur (statischen) strukturierung reichen klassen völlig aus. man kann ja auch reine datenklassen anlegen, die die funktion von structs in C erfüllen. getter und setter weglassen, alles public machen und schon hat man seine C structs.
    🙂

    Eben nicht!
    Ein

    struct sowieso str = calloc(riesengroß, sizeof(struct sowieso));
    

    ist eben nicht das Gleiche wie ein Java-Array nach diesem Muster:

    for (int i; i < a.length; i++) {
         a[i] = new MeineClass();
    }
    

    Beim ersten Codestück wird ein riesengroßer zusammenhängender Bereich angefordert, während beim zweiten Codestück Speicherbereiche auf dem Heap zusammengewürfelt werden. Bei jedem

    new MeineClass();
    

    wird auf dem Heap ein vielfaches an BLOCKSIZE angefordert. Diess beträgt meistens 512b, auch wenn der tatsächliche Bedarf (also die Werte in der Klasse) zum Beispiel nur 12b beträgt.

    Die Rechnung ist Simpel:
    Mal angenommen sizeof(struct sowieso) beträgt 12b und die Anzahl des Arrays soll 10000 sein, dann ist es in der C Lösung:
    12byte * 10000 = 120000 (zusätzlich wird aufgerundet auf nächstes Vielfaches von BLOCKSIZE).

    In der Javalösung ist das so:
    512b (nächstes Vielfaches von BLOCKSIZE bei 12b) * 10000 = 5120000;

    Auch wenn man es mir nicht glauben mag, ich habe es ausprobiert. In der Javalösung kommt eine "Heap out of memory Exception" während die C Lösung funktioniert.

    Gruß



  • Unter der Annahme, dass die Heapblockgröße unter Java (nur) 512 beträgt kann ich bei effektivem Bedarf von 12 für den gleichen (Speicher-)Preis unter C 42 mal so viele Modelle laden wie unter Java.

    Das nur so am Rande zum Thema Spieleentwicklung Java und C(++)



  • Woher hast du denn die 512 Bytes an Blockgröße? So richtig kann ich mir das nicht vorstellen, da die meisten Klassen imho nur ein paar mickrige Bytes in Anspruch nehmen sollten.



  • linuxbie_logout

    Das Objekte mehr Speicher benötigen als "primitive Datentypen" wie struct ist klar.

    Mit der Option java -XmxGröße kann man mehr Speicher anfordern.



  • Jer schrieb:

    linuxbie_logout

    Das Objekte mehr Speicher benötigen als "primitive Datentypen" wie struct ist klar.

    Mit der Option java -XmxGröße kann man mehr Speicher anfordern.

    Wo ist das "klar"?

    Die JVM hat sowieso ihre eigene Speicherverwaltung, sehr viele kleine Objekte auf dem "Heap" anzufordern kostet nichts, im Vergleich zu C/C++. In normalen C/C++ muss man auf die API des OS vertrauen, in Java macht die JVM ihre eigenen Regeln. Ob man in der JVM noch von Stack oder Heap reden kann, ist sache der VM.

    Es wuerde mich auch interessiern wo du diese 512bytes her hast.



  • schrott____ schrieb:

    frager schrieb:

    ... Werttypen wie C# (System.ValueType, struct)? 😕

    Diesen Schrott braucht man nicht
    http://www.geocities.com/csharpfaq/structs.html

    Gibts so ein FAQ auch fuer Java?


Anmelden zum Antworten