1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C# Arbeitsspeicher sparen

Discussion in 'Programmieren' started by Johnny2888, Mar 3, 2009.

Thread Status:
Not open for further replies.
  1. Johnny2888

    Johnny2888 Byte

    Hallo!

    Beim Übergeben von Objekten an eine Methode wird ja eine Kopie des Objektes erzeugt, mit der dann weitergearbeitet wird.
    Meine Frage ist, kann ich mit referenzierter Verwendung der übergebenen Objekten Arbeitsspeicher sparen, oder ist das ein Trugschluss?

    Bsp:
    MyMethod(ref obj)
    {
    }


    Grüße
     
  2. tetrododoxin

    tetrododoxin Kbyte

    Das hängt vor allem vom Typen des Objektes ab, das Du übergibst.

    Allerdings gehe ich mal davon aus, dass Du nicht versuchst durch Referenzieren eines Werte-Typen wie einem Integer versuchst Speicher zu sparen.
    Bei einem String würdest Du sicher Speicher sparen können, je nach Anwendung und Vorkommen, müsstest aber auch entsprechend behutsam damit umgehen.

    Bei Arrays oder Objekten komplexer Klassen, sparst Du ansich nichts weiter, da es sich dabei ohnehin um Referenztypen handelt und keine Kopie des kompletten Objekts erstellt wird, sondern eben nur eine Referenz.

    Ich hoffe, das konnte Dir helfen.
     
  3. Johnny2888

    Johnny2888 Byte

    Objekte:
    Wird die Kopie dann erst nach der Übergabe an die Methode im Falle des Überschreibens eines der public member erstellt, oder wie ist das zu verstehen?

    Ich bin eigentlich überzeugt, dass es sich stets um eine Kopie handelt,
    was soviel bedeutet wie doppelter Arbeitsspeicherbedarf.
     
  4. da_Ferdi

    da_Ferdi Halbes Megabyte

    Es werden immer Kopien erstellt, auch bei Verweistypen(*), wenn nicht mit dem ref- bzw, out- Schlüsselwort gearbeitet wird.


    (*)Value Types und Reference Types:

    Ein Value Type zeichnet sich dadurch aus, dass sein Wert direkt in ihm gespeichert wird, also auf dem Stack.

    Bei einem Reference Type wird in der Variable selbst auf dem Stack nur ein Verweis gespeichert, die Daten selbst werden auf dem Heap gespeichert. Der Verweis zeigt auf die Heap- Daten.

    Der Hintergrund: Objekte auf dem Stack benötigen weniger Platz und lassen sich einfacher und schneller verwalten.
     
  5. tetrododoxin

    tetrododoxin Kbyte

    Ähm, Ja und nicht ganz.
    Der Inhalt der Referenztypen liegt auf dem Heap, soweit korrekt und die Verweise darauf werden auf dem Stack übergeben. Das lliegt aber daran, dass zur Compilerzeit die Größe eines Objektes und somit der benötigte Speicherplatz auf dem Stack nicht festgelegt werden können. Das ist quasi der Sinn und Zweck von Zeigern.

    Wenn man ein Objekt, bzw. einen Verweistypen als Parameter übergibt, so wird ein Verweis auf denbereits existierenden Inhalt auf dem Heap erstellt und kein Inhalt kopiert, ergo kein doppelter Speicherbedarf.

    Was Du damit meinst verstehe ich nicht. 8 Byte sind sowohl auf dem Stack als auch auf dem Heap 64 Bit. Der Unterschied ist, dass man für den Zugriff auf den Heap immernoch einen entsprechend großen Zeiger(Referenz) braucht.
     
  6. Johnny2888

    Johnny2888 Byte

    @tetrododoxin
    Meinst du also, größere referenzierte Objekte zu übergeben wäre dann doch sparsamer?
    Ich bin jetzt ein wenig verwirrt.
     
  7. Fettbemme

    Fettbemme Halbes Megabyte

    @TO

    Es sollte eigentlich egal sein. Die Speicherverwaltung von C# bzw. .NET ist eigentlich relaiv gut. Wenn die Ressourcen knapp sind oder das Betriebssystem Speicher anfordert, räumt der Garbage Collector nicht mehr benötigte Referenzen und Objekte wieder auf. Das ist auch ein Grund wieso .NET Programme im Vergleich zu nativ programmierten Programmen augenscheinlich mehr Speicher benötigen, da nicht mehr benötigte Objekte ihren Speicher nicht sofort freigeben. Es heisst deshalb nicht, dass .NET Programme unbedingt mehr speicher verwenden als Programme die als native Code entwickelt wurden.
     
    Last edited: Mar 4, 2009
Thread Status:
Not open for further replies.

Share This Page