[C# .NET] memory alloceren met array

Pagina: 1
Acties:

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18-05 09:02
hoi

ik ben een tijd aan het stoeien en zoeken naar het volgende

ik maak een array aan op de volgende manier

Myclasse[] array = new Myklasse[1000];

echter als ik nu naar plaats 0,1,2 enz kijk dan is er geen Myclasse aangemaakt. dit is een probleem als ik daarna nog eens voor elke plek new Myclasse moet doen. dit kost mij teveel geheugen. aangezien dit op een pocket pc moet draaien wordt ik hier niet blij mee.

heeft iemand een oplossing hiervoor?

Klaas


Verwijderd

Aanmaken wanneer nodig, verwijderen wanneer het object niet meer wordt gebruikt,... Structs gebruiken ?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Ik snap je niet: als voor iedere MyKlasse een new doen teveel geheugen kost, waarom zou het initialiseren van een array van 1000 dan niet teveel geheugen zijn? :?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18-05 09:02
riezebosch schreef op donderdag 18 november 2004 @ 15:37:
Ik snap je niet: als voor iedere MyKlasse een new doen teveel geheugen kost, waarom zou het initialiseren van een array van 1000 dan niet teveel geheugen zijn? :?
dat komt door de structuur die .NET hanteert.
als ik een array van 1000 heb of 1000 lossen en nog eens verwijzingen daarnaar. dan kost dat meer geheugen dan nodig is.

Klaas


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:36
:?
Hoezo, dan kost dat meer geheugen dan nodig is ?
Ik snap je niet.

Waarom er geen objecten in die array zitten:
Je alloceert met die code gewoon een array waar er 1000 objecten van dat type in kunnen. Er zitten er alleen nog geen in.
Om er dan ook nog eens objecten in te steken moet je dit doen:
code:
1
2
3
4
for( int i = 0; i < 1000; i ++ )
{
   myArr[i] = new MyType();
}

https://fgheysels.github.io/


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
klaasopurk schreef op donderdag 18 november 2004 @ 15:38:
[...]


dat komt door de structuur die .NET hanteert.
als ik een array van 1000 heb of 1000 lossen en nog eens verwijzingen daarnaar. dan kost dat meer geheugen dan nodig is.
Die overhead is minimaal... Voor elke class maar 4 bytes voor de verwijzing, en als het nog zoals in C++ werkt is het zelfs maar 4 bytes voor de complete array omdat er alleen een verwijzing naar het eerste element bijgehouden wordt waarvan de rest afgeleid kan worden.

offtopic:
Hoi Klaas :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18-05 09:02
whoami schreef op donderdag 18 november 2004 @ 15:41:
:?
Hoezo, dan kost dat meer geheugen dan nodig is ?
Ik snap je niet.

Waarom er geen objecten in die array zitten:
Je alloceert met die code gewoon een array waar er 1000 objecten van dat type in kunnen. Er zitten er alleen nog geen in.
Om er dan ook nog eens objecten in te steken moet je dit doen:
code:
1
2
3
4
for( int i = 0; i < 1000; i ++ )
{
   myArr[i] = new MyType();
}
In java en C++ was het dat de objecten direct aangemaakt werden. je kon er direct over beschikken in iedergeval als je deze nodig was. je hoefde dus niet nog es new Myklasse te doen.

Klaas


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 15:42

GrimaceODespair

eens een tettenman, altijd ...

klaasopurk schreef op donderdag 18 november 2004 @ 16:40:
In java en C++ was het dat de objecten direct aangemaakt werden. je kon er direct over beschikken in iedergeval als je deze nodig was. je hoefde dus niet nog es new Myklasse te doen.
Is mijn C++ nu helemaal verroest, of alloceer je met
code:
1
MyClass[] array = new MyClass[1000]

niet ook gewoon impliciet 1000 keer het MyClass object (op de stack). In C# moet je na deze declaratie nog eens zelf 1000 keer MyClass objecten aanmaken (op de heap). Het principe blijft hetzelfde: je reserveert 1000x ruimte voor een MyClass object, toch?

In C++ gaat dat volgens mij ook alleen als je MyClass een default constructor heeft, zonder argumenten. Maar zoals ik al zei: mijn C++ is een beetje verroest.

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
GrimaceODespair: Laat ik maar zeggen dat je C++ roodbruin is. In C++ is new voor de heap. De essentie is dat je in C++ 1000 objecten op de heap zet. In C# is dat als ik geod begrijp niet zo, daar zet je ruimte voor 1000 pointers op de heap. Het C++ equivalent daarvan zou zijn
C++:
1
2
3
4
MyClass*[] array = new MyClass*[1000];
//
for( int i = 0; i<=1000;++i )
  array[ i ] = new MyClass;

[ Voor 1% gewijzigd door MSalters op 18-11-2004 23:15 . Reden: Sinds wanneer werkt [i] in [code]? ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 15:42

GrimaceODespair

eens een tettenman, altijd ...

Wat MSalters zei ;)

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Hoe ziet je CustomClass er uit, is het niet makkelijker (lees: geheugen gebruiks vriendelijker) om een Struct te gebruiken?

En zijn er echt 1000 instancies nodig?

Verwijderd

Waarom geen collections gebruiken zoals ArrayList om je objecten in op te slaan ? Zo kan je op het moment dat het nodig is je objecten aanmaken en verwijderen. Voor een pocket PC lijkt mij dit veel "geheugenvriendelijker" dan een new op een tabel van 1000 elementen.

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 16:26
klaasopurk schreef op donderdag 18 november 2004 @ 16:40:
[...]


In java en C++ was het dat de objecten direct aangemaakt werden. je kon er direct over beschikken in iedergeval als je deze nodig was. je hoefde dus niet nog es new Myklasse te doen.
In Java moet je wel degelijk de objecten apart aanmaken. Dat je direct kunt beschikken over in dit geval 1000 objecten is dus onzin
Pagina: 1