www.mikrocontroller.net

Forum: PC-Programmierung C# - Benutzen nicht referenzierte Objekte bereits Speicherplatz ?


Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Objekt:
Circle meinKreis;

benutzt dieses Objekt jetzt schon Speicherplatz oder reserviert diesen?
Ich habe nämlich folgendes Problem:

Ich möchte eine Klasse erstellen die eine große Anzahl an Objekten 
enthält.
Je nach Parameterübergabe wird jedoch nur eine gewisse Anzahl an 
Objekten benötigt.
Da ich aufgrund der großen Anzahl an Objekten angst habe den Speicher 
zuzumüllen möchte ich darauf achten.

Programm sähe in etwa so aus (Beispielcode):
public void (int zahl)
{
    Circle meinKreis;
    Circle ovale;

    if(zahl==1)
    {
      meinKreis = new Circle();
      //befüllen
    }

}

Soweit wüßte ich mir da als Anfänger glauben behelfen zu können.
Geht das so OHNE unnötig Speicherplatz zu reservieren oder zu 
verschwenden, oder ist da eine anderes herangehensweise notwendig?

Da ich "ovale" ja nicht benötige braucht es ja auch keinen Speicherplatz 
zu verwenden.

Danke für Eure Ratschläge Tips und Hinweise

MFG

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco K. wrote:

>     Circle meinKreis;

Ist ein Objekt, das während der Dauer seiner Sichtbarkeit, also zur 
Laufzeit der Funktion, Platz auf dem Stack belegt.

>       meinKreis = new Circle();

Weist einem Objekt die Adresse eines Objektes zu. Gibt üblicherweise 
eine Fehlermeldung aufgrund inkompatibler Datentypen beiderseits "=".

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Circle meinKreis;
Ist eine Referenz auf ein Circle Objekt. Diese belegt als lokale 
Variable je nach Architektur 4 bis 8 Bytes am Stack, also wesentlich 
weniger als das eigentliche Objekt.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sicher? dann wäre es aber ein Pointer....

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In C# werden Pointer als Referenzen bezeichnet, da auf Referenzen nur 
mehr die Operatoren == und != angewandt werden dürfen.
Pointer wie es sie in C gibt gibt es in C# nur in usafe-Blöcken und 
diese werden nur sehr selten, bis nie gebraucht.

Ich bin allerdings in meinem ersten Post davon ausgegangen, das es sich 
beim Typ Circle um eine Klasse handelt. Wäre Circle ein struct, würde 
das ganze Objekt in diesem Fall am Stack angelegt werden.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre dann doch totale Anarchie?!

Wenn "MeineKlasse" eine Klasse ist (die Klasse selbst, nicht irgendeine 
typedef-Konstruktion), dann ist "MeineKlasse a;" ein Objekt der Klasse 
und belegt soviel Speicher, wie die Klassenvariablen und so weiter 
benötigen.

Dagegen würde "MeineKlasse *a;" dann nur soviel Speicher belegen, wie 
ein Zeiger braucht.

Und schließlich wäre "MeineKlasse &a = ...;" dann eine Referenz, die 
prinzipiell auch nur Speicher für einen Zeiger braucht.

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, SORRY, mein Fehler, Circle ist in dem Fall wirklich eine Klasse, 
hätte ich zusätzlich erwähnen sollen.

Struct wäre klar, würde sofort angelegt werden.

Ich habe es also richtig verstanden, das hier quasi nur ein "Verweis" 
auf die Objektart" angelegt wird (also eine "Art" ""pointer"")), das 
Objekt aber noch nicht erzeugt wird und somit erstmal noch keinen 
zusätzlichen Speicher erzeugt, außer halt dem Verweis.

Erst der "new" Operator legt es an und erst ab DANN wird auch wirklich 
der Speicher dafür reserviert ...

Soweit wäre für mich schonmal alles OK, dann kann ich es ja so machen.

Ich danke Euch für Eure Hilfe !

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das wäre dann doch totale Anarchie?!

Inwiefern? C# ist eben nicht C++

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn "Circle x;" schon eine Referenz ist, wie unterscheidet es 
sich denn dann von einem Objekt/einer Struktur?

Aber du hast Recht, in C# ist das tatsächlich so undurchsichtig (wie ich 
finde, aber naja) gelöst:
http://www.aspheute.com/artikel/20000726.htm

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Circle meinKreis;

>benutzt dieses Objekt jetzt schon Speicherplatz oder reserviert diesen?

nein, erst new "stellt einen Antrag auf Speicher"
dieser Antrag kann abgeschossen werden => exception no memory whatever

wie andere gesagt haben, ist es bei struct anders!

und in C++ würde es bereits Speicher beanspruchen, dafür
stellt C++ pointer Konzept wenn man andere Semantik möchte

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.