Struct vs klasse for lenge levd gjenstander

stemmer
15

Når du trenger å ha svært små objekter, sier som inneholder to float eiendom, og du vil ha millioner av dem som ikke kommer til å bli ødelagt med en gang, er structs et bedre valg eller klasser?

Som i XNA som et bibliotek, er det point3s, etc som structs men hvis du trenger å holde på disse verdiene i lang tid, ville det utgjøre en forestilling trussel?

Publisert på 03/03/2009 klokken 21:57
kilden bruker
På andre språk...                            


6 svar

stemmer
34

I motsetning til de fleste spørsmål om structs, faktisk synes dette å være en god bruk av en struct. Hvis dataene den inneholder er verdityper, og du kommer til å bruke mye av disse, ville en struktur fungere godt.

Noen tips:

:: Den struct bør ikke være større enn 16 byte, eller du mister ytelse fordeler.

:: Gjør struct uforanderlige. Det gjør bruken klarere.

Eksempel:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}
Svarte 03/03/2009 kl. 22:14
kilden bruker

stemmer
5

Svaret avhenger av hvor objektene / verdier til slutt vil bli lagret. Hvis de skal lagres i en utypet samling som Arraylist, så ender du opp med boksing dem. Boksing skaper et objekt wrapper for en struct og fotavtrykk er det samme som med en klasse objekt. På den annen side hvis du bruker en skrev utvalg som T [] eller List, deretter bruke structs vil bare lagre de faktiske dataene for hvert element med plass for hele samlingen, og ikke dens elementer.

Så structs er mer effektive for bruk i T [] arrays.

Svarte 03/03/2009 kl. 22:14
kilden bruker

stemmer
2

Som regel er store matriser av ikke-alias (dvs. udelte) data av samme type best lagret i structs for ytelse siden du redusere antall indirections. (Se også når-er-structs-the-svar ). Den nøyaktige ytelse forskjell mellom klasse og struct avhenger av bruken din. (Eg, i drift, har du bare tilgang til deler av struct? Har du gjøre mye av midlertidig kopiering? Hvis struct er liten er det sannsynligvis alltid bedre å bruke, men hvis det er stor, kan opprette midlertidige kopier bremse deg ned. Hvis du gjøre det uforanderlige må du alltid kopiere hele greia for å endre verdien.)

Når du er i tvil, måle.

Siden du er interessert i mulige langtidseffekter som kanskje ikke er synlig ved en slik måling, være klar over at slike rekker sannsynligvis lagret på den store-objekt haugen og bør brukes om igjen i stedet for ødelagt og re-tildelt. (se CRL Inside Out: Stor Object Heap Uncovered .)

Ved passering større størrelse structs i samtaler kan det være lurt å passere dem med dommeren argument for å unngå kopiering.

Svarte 04/03/2009 kl. 03:06
kilden bruker

stemmer
2

Struct synes riktig for dette programmet.

Husk at de "trenger å holde på disse verdiene" innebærer deres lagring på haugen et sted, sannsynligvis en rekke felt av en klasse instans.

En ting å se opp for er at dette resulterer i en fordeling på den store objekt haugen. Det er ikke så klart hvordan, om i det hele tatt, defragmenterer denne haugen seg selv, men på veldig lenge levd gjenstander som kanskje ikke er et problem.

Ved hjelp av klassen for millioner av disse datatypene vil trolig bli dyrt i skjær volumet av dereferencing som trolig vil ta plass for operasjoner på denne typen.

Svarte 03/03/2009 kl. 22:10
kilden bruker

stemmer
2

Den store bekymringen er om minnet er tildelt på stakken eller haugen. Structs gå i bunken som standard, og bunken er generelt mye mer begrenset når det gjelder plass. Så lage en hel haug med structs akkurat som det kan være et problem.

I praksis, selv om jeg egentlig ikke tror det er så stor av en avtale. Hvis du har som mange av dem de er sannsynligvis en del av en klasse instans (på haugen) et sted.

Svarte 03/03/2009 kl. 22:08
kilden bruker

stemmer
1

Verdi typer (struct) er god for type som ikke er tildelt på haugen ofte, det vil si, de er stort sett inneholdt i en annen referanse eller verditype.

Den Vector3 eksempel du ga er et perfekt eksempel. Du vil sjelden ha dingler Vector3 i haug, vil de mesteparten av tiden ligge i en type som er i seg selv i haug, eller brukes som en lokal variabel, i så fall, vil det bli tildelt på stakken.

Svarte 03/03/2009 kl. 22:09
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more