(.Net) Er det noen iboende forskjell mellom .net Explicit structs og C ++ fagforeninger?

stemmer
1

Det er spørsmålet. Er det noe du kan gjøre med C ++ fagforeninger som du ikke kan med C # Eksplisitt structs?

Publisert på 22/07/2009 klokken 00:11
kilden bruker
På andre språk...                            


3 svar

stemmer
2

C # eksplisitte structs har noen problemer når det gjelder referanser / pointer-sized medlemmer.

Fordi du må eksplisitt angi plasseringen, men "sizeof (IntPtr)" er ikke en kompilering-tidskonstant (i motsetning til C ++ sizeof), er det umulig å bruke pekeren store medlemmer i eksplisitte structs når monteringen skal kunne brukes i både 32- bits og 64-bits prosesser.

Dessuten er det mulig å bruke eksplisitte structs å "konvertere" mellom referanser og pekere:

[StructLayout(LayoutKind.Explicit)]
struct Test
{
    [FieldOffset(0)]
    public IntPtr ptr;
    [FieldOffset(0)]
    public string str;
}

Når du gjør dette, vil forsamlingen krever usikre kode tillatelse; og det er problemet at GC ikke vet hva de skal gjøre med struct innhold - det er en peker GC skal spore, eller er det bare et tall?

Så for å svare på spørsmålet ditt: "Er det noe du kan gjøre med C ++ fagforeninger som du ikke kan med C # Eksplisitt structs?"

Ja, er det noen ganger nyttig i C ++ for å presse to biter av data inn i de nedre biter av en peker. Det er mulig fordi de to nederste biter av pekere alltid vil være 0 når pekeren justert.

Pokker, hvis du skriver en dobbelt-lenket liste av to-bits heltall, kan du også lagre både pekere og data i 32 biter! ( "forrige ^ neste ^ data", se XOR lenket liste )

Men du kan ikke gjøre noe sånt i C #, som du ville forvirre GC.

Svarte 22/07/2009 kl. 01:25
kilden bruker

stemmer
1

Nei egentlig ikke. Den LayoutKind attributt er en måte å Marshall data i C ++ fagforeninger i interoperabilitet. Det er faktisk langt mer fleksibel enn unionen søkeord i C ++, siden du har full kontroll over oppsettet i C # med structs.

Svarte 22/07/2009 kl. 00:16
kilden bruker

stemmer
0

Du kan ikke overlappe en rekke av en annen type enn data. For eksempel kan du ikke overlappe byte [4] og int16, int16. Det vil krasje under kjøring.

Svarte 26/01/2012 kl. 20:25
kilden bruker

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