2012-05-09 17 views
13

So che in C++/CLI non si può utilizzare tipi non gestiti quando si definisce una classe gestita:Perché una struttura non gestita non può essere un membro di una classe gestita?

public struct Unmanaged 
{ 
    int x; 
    int y; 
}; 

public ref class Managed 
{ 
    int one; 
    Unmanaged two; //error C4368 
}; 

Non capisco perché però. Unmanaged è semplicemente una raccolta di tipi nativi - la sua dimensione è nota, sicuramente (e con essa intendo il blocco di memoria che la definisce) verrebbe spostata con il "blocco di memoria" che è Managed all'interno dell'heap gestito e qualsiasi offset memorizzato nei metadati rimarrà valido, no? Proprio come se fossero stati dichiarati un intero o un float?

Perché non è possibile combinare tipi diversi?

+0

Chi ti aspetti di poter rispondere in modo autoritario a una domanda del genere? – ildjarn

+0

@ildjarn bene, io stavo per controllare il codice sorgente C++/CLI e scrivere una bella risposta ... owait –

+1

Temo non capisco; qualcuno con più conoscenza del funzionamento C++/CLI di me? Durante la progettazione del compilatore, qualcuno deve aver avuto la stessa ipotesi che asserisco nel mio post (o l'ipotesi è completamente sbagliata!), E poi ho capito che per alcune condizioni non era vero, quindi l'errore - ero solo curioso per quanto riguarda quella condizione. Nel post sul blog di Tony legato è stato spiegato che l'attribuzione dei tipi nativi sul heap gestito è stato annullato per fermare le persone che abusano pin_ptr per tornare quei 'casi' di codice non gestito. – sebf

risposta

15

Il tipo misto si riferisce in realtà ai modelli di memoria mista. I tipi non gestiti vanno nell'heap, i tipi gestiti vanno nell'heap garbage collection, quindi quando si incorpora un tipo non gestito in un managed, richiederebbe memoria su entrambi gli heap, motivo per cui si fa questo genere di cose con un puntatore. Il puntatore è gestito, il valore a cui punta non lo è.

Ero curioso, quindi ho raccolto il mio google e ho trovato questo.

http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

Guy sembra sapere di cosa sta parlando.

Buona domanda però ...

+0

Ci sono delle ottime informazioni in quel post, grazie mille! Mi chiedo quante altre caratteristiche linguistiche siano state progettate esclusivamente per evitare che i programmatori commettano errori (ne conto almeno uno in C#, nessuna caduta tra i casi nelle istruzioni switch) – sebf

+1

Lotti e noi, beh io: D ne ho bisogno molti altri –

Problemi correlati