Fixed Size Buffer kann nicht direkt von "diesem" Objekt verwendet werden

8

Ich verwende eine Struktur, um reine Daten darzustellen. Eines der Felder ist ein Puffer fester Größe, wie unten gezeigt.

%Vor%

Innerhalb der Get / Set-Funktionen habe ich versucht, folgendes zu tun, aber ich bekomme "Compiler Error CS1666: Sie können keine Puffer fester Größe verwenden, die in unfixierten Ausdrücken enthalten sind. Verwenden Sie die feste Anweisung."

%Vor%

Allerdings die folgende Arbeit:

%Vor%

Ich kann die Problemumgehungen leicht verwenden, aber ich frage mich, warum der direkte Zugriff auf den Puffer fester Größe von diesem illegal ist. Oder ist das ein Fehler, den ich melden sollte?

Ich verwende .NET 2.0.

    
coderforlife 15.05.2011, 23:31
quelle

2 Antworten

11

Es liegt an den zugrunde liegenden IL-Anweisungen.

Das Programm führt diese Befehlsfolge durch, um das gewünschte Element zu erhalten:

  1. Laden Sie die Adresse auf den Stapel.

  2. Laden Sie den Offset auf den Stapel.

  3. Fügen Sie sie hinzu.

  4. Lesen Sie den Wert an dieser Speicheradresse.

Wenn sich das Objekt im Heapspeicher befindet und sich dann wegen der Speicherbereinigung vor Schritt 4 bewegt, ist die aus Schritt 1 geladene Adresse nicht mehr gültig. Um dagegen zu schützen, müssen Sie das Objekt zuerst in den Speicher stecken.

(Die Tatsache, dass Sie über den this -Zeiger auf die Struktur zugreifen, bedeutet, dass Sie keine Ahnung haben, ob sich die Struktur auf dem Heap oder auf dem Stack befindet, also müssen Sie sie anheften, falls sie auf dem Heap ist .)

Das zweite Beispiel funktioniert, weil die Struktur auf den Stapel kopiert und die Kopie sich daher niemals bewegen kann, so dass die Adresse immer gültig ist.

>

Warum tritt das gleiche Problem nicht bei anderen Arten von Feldern auf? Da ihr Offset bei compile-time bekannt ist, während der Array-Index unter runtime bekannt ist, kann der JIT Code generieren, der immer korrekt auf die Felder zugreift.

    
Mehrdad 15.05.2011, 23:37
quelle
4

Die Perspektive, aus der Sie das Schlüsselwort fixed betrachten, ändert seine Semantik, was ziemlich verwirrend ist. Der ursprüngliche Zweck der fixed Anweisung war es, einen Teil des blitbaren Speichers an Ort und Stelle zu setzen, in C # 2.0 wird er zusammen mit einer Felddeklaration verwendet, um anzuzeigen, dass das Array genau N Elemente lang ist ', also von fester Größe, nicht im Speicher fixiert.

Ich würde das fixed Schlüsselwort in der Felddeklaration loswerden und einfach verwenden:

%Vor%

Auf diese Weise ist die Struktur immer noch blitable und kein Schmerz in den Hintern zu arbeiten.

    
arul 16.05.2011 00:40
quelle

Tags und Links