2012-05-09 13 views
13

Ich weiß, in C++/CLI man kann nicht nicht verwalteten Typen verwenden, wenn eine verwaltete Klasse definieren:Warum kann eine nicht verwaltete Struktur kein Mitglied einer verwalteten Klasse sein?

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

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

Ich verstehe nicht, warum though. Unmanaged ist einfach eine Sammlung von nativen Typen - seine Größe ist bekannt, sicherlich ist es (und damit meine ich den Speicherblock, der es definiert) würde mit dem 'Block des Speichers' bewegt werden, die Managed innerhalb des 'verwalteten Heap' ist und welcher Offset in den Metadaten gespeichert wird, bleibt gültig, nein? So als ob eine ganze Zahl oder ein Float deklariert wäre?

Warum können wir nicht Typen mischen?

+0

Wen erwarten Sie, eine solche Frage autoritativ beantworten zu können? – ildjarn

+0

@ildjarn Nun, ich wollte nur den C++/CLI-Quellcode überprüfen und eine nette Antwort schreiben ... owait –

+1

Ich fürchte, ich verstehe es nicht; jemand mit mehr Wissen über die Funktionsweise C++/CLI als ich? Bei der Gestaltung des Compilers muss jemand die gleiche Annahme haben, die ich in meinem Beitrag behaupte (oder die Annahme ist völlig falsch!), Und erkannte dann, dass es für eine Bedingung nicht wahr war, daher der Fehler - ich war nur neugierig was diese Bedingung war. In dem Blogpost, den Tony verlinkte, wurde erklärt, dass die Zuweisung von nativen Typen auf dem verwalteten Heap nicht erlaubt war, um Leute daran zu hindern, pin_ptr zu verwenden, um diese "Instanzen" in nicht verwalteten Code zurückzugeben. – sebf

Antwort

15

Gemischter Typ bezieht sich eigentlich auf die gemischten Speichermodelle. Nicht verwaltete Typen werden auf dem Heap gespeichert, verwaltete Typen werden in den Garbage-Collected-Heap übernommen. Wenn Sie also einen nicht verwalteten Typ in einen verwalteten einbetten, erfordert dies Speicher auf beiden Heaps, weshalb Sie diese Art von Vorgang mit einem Zeiger ausführen. Der Zeiger wird verwaltet, der Wert, auf den er zeigt, ist nicht.

Ich war selbst neugierig, also habe ich meine Google gesammelt und diese gefunden.

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

Guy scheint zu wissen, wovon er spricht.

Gute Frage aber ...

+0

Es gibt einige großartige Informationen in diesem Beitrag, vielen Dank! Ich frage mich, wie viele andere Sprachmerkmale nur dazu dienen sollen, Programmierer daran zu hindern, Fehler zu machen (ich zähle mindestens eins in C#; keine Fälle in switch statements) – sebf

+1

Viele und wir, naja ich: D brauche viele, viele mehr –

Verwandte Themen