Når er det verdt å bruke en peker til konstruere i en struct definisjon?

stemmer
4

Beklager hvis spørsmålet er ikke klart; Jeg fant det ganske vanskelig å forklare i en setning.

Si jeg har en structmed et medlem som er en struct, for eksempel følgende:

struct A {
    struct B b;
};

La oss si at jeg har tenkt forekomster av denne struktur for å være haug-allokert alltid. Er det noe å hente ved å endre det til dette? (dvs. holde en peker til struct B)

struct A {
    struct B *b;
};

I sistnevnte tilfelle vil jeg ha et par funksjoner som make_Aog free_Asom ville ta vare på allokering og de-allokere minnet peker på b;

Den eneste eksemplet jeg kan tenke på hvor den andre formen kan være å foretrekke er når ikke alle tilfeller av struct Afaktisk vil gjøre bruk av b. I så fall kan minne bli frelst ved bare å fordele den ekstra minne for de tilfeller som krever det.

Er det noen andre tilfeller hvor den andre formen tilbyr noe nyttig?

Publisert på 13/04/2009 klokken 00:27
kilden bruker
På andre språk...                            


3 svar

stemmer
7

Hvis hver Avil ha nøyaktig ett B, bør du ikke bruke en peker til B.

Foruten det faktum at du ikke trenger å bry seg med den ekstra minnehåndtering, det er faktisk tregere og mindre effektivt å fordele B.

Selv om du ønsker å passere en peker til Bå annen kode, kan du fortsatt passere denne adressen.

Svarte 13/04/2009 kl. 00:31
kilden bruker

stemmer
5

Når en forekomst av B kan deles av flere forekomster av A vil man få ved å ha en peker til B. Det bidrar til å unngå duplisering og opprettholde versjoner av B i mer enn ett sted. Per Jonathan kommentar dette kommer til en kostnad av å vite når man skal frigjøre minne og couting referanser til B.

Svarte 13/04/2009 kl. 00:33
kilden bruker

stemmer
3

Jeg tror du har truffet spikeren på hodet med den siste setningen. Hvis ikke alle Ahar en B, så kan du få minne spare ved å bruke en peker (null for de Aer uten B).

Dette er usannsynlig å være veldig nyttig med mindre den kumulative størrelsen på alle de ubrukte Bs er en betydelig andel av den tilgjengelige haugen.

Men jeg ville endre kontoutskriften for å lese "når ikke alle tilfeller av Avil ha nøyaktig ett eksemplar av B" for følgende grunn (og dette er den andre saken du spør etter):

Der Ber en node i en liste (som også inneholder en peker til en annen Beller null), ville jeg gjøre det en peker [selv om du kan fortsatt legge inn den første noden hvis alle As måtte ha minst en B].

Den andre muligheten er å dele Bs blant de As hvis deres natur tillater det (for eksempel Avære en windows på en skjerm B), selv om du måtte referere-telle Bs i så fall slik at man vet når man skal endelig frigjøre dem i free_A()samtaler (og, selvfølgelig, å være i stand til å bruke et allerede eksisterende Bi dine make_A()samtaler).

Svarte 13/04/2009 kl. 01:28
kilden bruker

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