Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

41

22.07.2008, 14:54

RAII - Resource Acquisition Is Initialization: Das passiert jedesmal wenn ich eine Instanz einer Klasse erzeuge, egal ob auf dem Heap oder auf dem Stack. Ich muss aber gestehen, dass sich die Definition im Laufe der Jahre etwas gewandelt hat, jetzt ist auch die Freigabe mit eingeschlossen und umfasst den ganzen Lebenszyklus eines Objekts.

Wie und C# kann das nicht den Destruktor eines stink normalen Objekts am Ende des Scopes aufrufen? Es muss ja noch nichtmal der Speicher freigegeben werden ... Wie will man denn da elegant Exception-sicher Multithreaded-Anwendungen schreiben?

Okay, mal was zum Thema (sofern wir da noch sind):

Zitat

Es wäre dadurch natürlich von Vorteil eine Sprache zu wählen, die C++ recht ähnlich ist, damit ich von meinen Kentnissen profetieren kann

Der Weg des geringsten Widerstands ist nicht immer der beste. Unteranderem lernst du so am wenigsten. Leider wird es dir mit allen 3 Sprachen so gehen. Deswegen empfehle ich dir Java, wegen der "Interoperabilitaet" und der MS-Unabhaengigkeit.

Zitat

fortgeschritten im Umgang mit C++ bin

Illusion

Anonymous

unregistriert

42

22.07.2008, 15:30

knivil
ich habe schon am anfang des Threads gesagt, das die Aussage
"Deswegen empfehle ich dir Java, wegen der "Interoperabilitaet" und der MS-Unabhaengigkeit. "
Bullshit ist. Wenn ich sowas schon lese, "Interoperabilität" und "MS-Unabhängigkeit". Da wird man eher Sun-Abhängig und benutzt eine Sprache die nicht standardisiert ist.

Edit: C# kann am Ende eines Scopes den Destruktur aufrufen, exakt wie Java. Aber es gibt den Speicher wie Java nicht frei, sondern Sammelt erst, wie Java. Um das "Sammeln" zu unterminieren gibt es using, wo man dem GC direkt mit sagen kann: "Mich direkt freigeben".

Also hier so ne Manier "Ach C# kann das nicht? Guck leiber mal Java" ist auch nicht gerade die feine Art.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

43

22.07.2008, 15:38

Nehmt doch einfach etwas völlig anderes..
Python.. Ruby.. Lua.. Lisp.. Ada.. Brainfuck oder Ook! :lol:

Ersteres kann ich btw wirklich empfehlen :)

Zum Thema:
Es klingt hier häufig so, dass der Garbage Collector so "dumm" ist und den Speicher sammelt, statt ihn direkt freizugeben. Das ist in den meisten Fällen garnicht so dumm, da die CPU erst mit der Speicherverwaltung belastet wird sobald es auch nötig ist. (In Java afaik auch wenn die CPU idlet.)
Ist natürlich nicht immer optimal, ein an das Problem angepasstes Speichermangment ist natürlich schneller als ein allgemeines System.

Ich denke das muss jeder für das zu lösende Problem entscheiden. Einfach aus Prinzip auf Java oder C# zu verzichten weil sie mit einem GC arbeiten ist schwachsinn. Man muss immer zwischen Implementierungsaufwand und Performance abwägen. Sonst könnte man gleich alles in Assembler schreiben.

Daher ist mein Vorschlag eine komplett andere Sprache zu lernen garnicht so verkehrt. Es erweitert den Horizont für andere Lösungswege, und die gewonnene Erfahrung erleichtert das erlernen anderer Sprachen.
Es ist immer hilfreich für das entsprechende Problem die richtige Sprache parat zu haben, und das lernt man nicht indem man nur C++ oder ähnliche Sprachen lernt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

44

22.07.2008, 15:45

Zitat von »"knivil"«


Wie und C# kann das nicht den Destruktor eines stink normalen Objekts am Ende des Scopes aufrufen? Es muss ja noch nichtmal der Speicher freigegeben werden ... Wie will man denn da elegant Exception-sicher Multithreaded-Anwendungen schreiben?


Mich würde mal interessieren was du unter elegant verstehst...
@D13_Dreinig

45

22.07.2008, 15:54

Um ehrlich zu sein, ich mag alle 3 Sprachen nicht, die zur Auswahl stehen. Wenn es nur um den Speicher geht, naja ist halt ne Eigenart von Java und C#. Wenn man explizite kontrolle ueber die Speicherverwaltung will, dann sollte man eine andere Sprache waehlen.

@unsigned long: Deswegen die Anfuehrungsstriche ...

Zitat

Also hier so ne Manier "Ach C# kann das nicht? Guck leiber mal Java" ist auch nicht gerade die feine Art.

Du bist sehr oberflaechlich, Teil A und Teil B sind durch ein "Okay, mal was zum Thema ..." deutlich voneinander getrennt.

@David_pb:
Naja, Mutex und Co. sind ja Systemressourcen. Dort hat man fuer gewoehnlich eine Klasse MutexLocker, der im Konstruktor ein Mutex uebergeben wird und gesperrt wird. Beim Verlassen des Scopes wird automatisch durch dessen Destruktor der Mutex freigegeben. Da wie in einem angegeben Link weiter oben angemerkt wurde, C# sei nur ueber eine Krueke RAII-faehig, waere es schwierig, dieses Konzept in C# zu uebernehmen.

@xardias

Zitat

Es ist immer hilfreich für das entsprechende Problem die richtige Sprache parat zu haben, und das lernt man nicht indem man nur C++ oder ähnliche Sprachen lernt.

Java, C#, C++ sind sich alle sehr aehnlich, obwohl C++ z.B. mehrere Programmierparadigmen zulaesst. Ich waere ja fuer das Erlernen einer logischen Programmiersprache.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

46

22.07.2008, 16:33

Zitat von »"knivil"«


@David_pb:
Naja, Mutex und Co. sind ja Systemressourcen. Dort hat man fuer gewoehnlich eine Klasse MutexLocker, der im Konstruktor ein Mutex uebergeben wird und gesperrt wird. Beim Verlassen des Scopes wird automatisch durch dessen Destruktor der Mutex freigegeben. Da wie in einem angegeben Link weiter oben angemerkt wurde, C# sei nur ueber eine Krueke RAII-faehig, waere es schwierig, dieses Konzept in C# zu uebernehmen.


Dafür nutzt man normal den finally Zweig eines try-catch Konstrukt. Das Scoped Locking- (Execute Around Object-, RAII-) Idiom ist eben etwas C++ typisches.
@D13_Dreinig

Werbeanzeige