Was ist die Verwendung von C # keyword fixed / unsafe? [Duplikat]

8

Was nutzt das C # Keyword fixed / unsafe?

Zum Beispiel Ссылка

%Vor%

Warum muss ich es überhaupt reparieren? Danke

    
Swab.Jat 24.02.2014, 07:12
quelle

3 Antworten

15

C # ist eine verwaltete Sprache , dh der Speicher wird automatisch verwaltet, d. h. nicht von Ihnen. Wenn Sie fixed nicht zu dem Zeitpunkt verwendet haben, an dem Sie den Speicher ändern, auf den der Zeiger zeigt, könnte C # die Variable an einen anderen Speicherort verschoben haben, so dass Sie etwas anderes ändern könnten!

fixed fixiert die Variable logisch im Speicher, so dass sie sich nicht bewegt.

Warum bewegt C # Variablen im Speicher herum? Um den Speicher zu komprimieren, würden Programme sonst mehr Speicher verbrauchen, wenn Objekte, die nicht mehr existieren, Löcher hinterlassen, in die andere Objekte nicht hineinpassen (Heap-Speicherfragmentierung).

Ich habe fixed extensiv in einer .NET-Bibliothek verwendet , die für Ressourcenbeschränkungen ausgelegt ist Geräte, um zu vermeiden, Müll-Kopieren in Puffer zu erstellen, und finden, dass diese Funktion in anderen verwalteten Sprachen fehlt, in denen Sie nicht dasselbe tun können. Wenn Sie Spiele in einer verwalteten Sprache schreiben, ist die Garbage-Collection oft einer der größten Engpässe. Daher ist es sehr hilfreich, sie nicht erstellen zu können!

Siehe meine Frage hier: C # Variablen in den Puffer ohne kopieren Müll zu schaffen? aus einem Grund, warum.

    
markmnl 24.02.2014 07:22
quelle
5

unsafe ist notwendig, um mit Zeigern umzugehen.

fixed hat zwei Verwendungszwecke:

  • erlaubt es Ihnen, ein Array zu pinnen und einen Zeiger auf die Daten
  • zu erhalten
  • Wenn es in einem unsafe struct -Feld verwendet wird, deklariert es einen "fixed buffer" - einen reservierten Raumblock in einem Typ, auf den über Zeiger anstatt regulärer Felder zugegriffen wird

Um mit einem bestimmten Beispiel zu antworten - hier ist ein Code, der verwendet wird, um eine semantische Gleichheit zwischen zwei byte[] beliebiger Größe zu erreichen ...

%Vor%

Wenn also zum Beispiel der Puffer 1000 Elemente enthielt, machen wir ihn nur als eine Menge von long . Wir machen jetzt nur 125 Iterationen, anstatt alle 1000 einzeln betrachten zu müssen. was die JIT entfernen kann oder auch nicht, je nachdem, wie offensichtlich aussieht, dass Sie möglicherweise nicht gegen sie verstoßen können.

    
Marc Gravell 24.02.2014 07:35
quelle
0

Unsafe Codeblöcke sind ziemlich selten zu benutzen. Sie werden hauptsächlich verwendet, wenn Sie Zeiger erstellen und verwenden möchten. Außerdem ist jeder Code in einem unsicheren Block außer Kontrolle von CLR. Es gilt als nicht verifizierbar (von MSDN) soweit CLR betroffen ist.

Wenn die Speicherbereinigung stattfindet, werden einige Objekte möglicherweise verschoben. Mit dem Präfix fixed geben wir dem Framework den Befehl, Objekte, auf die die Adresszeiger zeigen, nicht zu verschieben.

    
danish 24.02.2014 07:21
quelle

Tags und Links