2009-07-22 9 views
0

Gibt es eine neue Platzierung in .NET (wie C++)?.NET-Platzierung Neu

Mit anderen Worten, wenn ich zuteilen einige Speicher in VB.NET


Dim Foo(64) as Byte 

ich Instanz BarClass im Foo Speicher wollen (so etwas wie ...)


Dim Bar as New BarClass(Foo) 

Aber ich sehe keine Syntax dafür.

Stattdessen habe ich so etwas wie zu tun:


Dim Foo(1) as BarClass 
Foo(0) = new BarClass(x, y, z) 
Foo(1) = new BarClass(x, y, z) 

Antwort

2

Nein, es gibt kein equivelent in .NET.

Darüber hinaus kann der GC Ihr Objekt jederzeit frei im Speicher verschieben (vorausgesetzt, es wurde nicht an einem Ort fixiert). Diese Art von Verhalten ist normalerweise etwas, das in den meisten .NET-Code vermieden wird.

Sie können dies umgehen, indem Sie nativen Code und Interop verwenden.

+0

Interessant, würde ich sagen, dass einmal GC instanziert den Speicher noch bewegen könnte, wie die Referenz sowieso aktualisiert wird. Also, was ist eine gute (effiziente) Syntax, um ein Array von Klassen zu initialisieren ... Ich weiß, ich weiß, eine Liste verwenden. –

+1

Initialisieren Sie sie einfach in einer engen Schleife. Ein Vorteil des GC (im Vergleich zu C++) ist, dass die Speicherinitialisierung von Klassen normalerweise VIEL schneller ist, so dass diese Arten von Spielen keine Rolle mehr spielen. Der GC wird automatisch Dinge in den kompakten Speicher verschieben, und die Zuweisungen sind normalerweise nur ein Löschen von Bits, nicht eine vollständige Speicherzuweisung des Betriebssystems, also ist es in den meisten Fällen viel schneller als C++. –

0

Werfen Sie einen Blick auf LayoutKind. Wenn Sie auf "Explizit" setzen, erhalten Sie ein C++ - ähnliches Verhalten.

+0

Dies ist sehr anders als Placement neu. Durch die Platzierung von new können Sie jedes Objekt (in C++) an einer bestimmten Stelle im Speicher platzieren ... Es hat mehr mit der Feinsteuerung der Speicherzuordnungen zu tun, die in .NET allesamt vom GC verarbeitet wird. –

0

Der Grund für die Verwendung von Platzierungen in C++ liegt darin, dass das Betriebssystem 64 Byte Speicher benötigt, wenn Sie 64 Byte Speicher anfordern. Wenn Sie also mehrere Objekte gleichzeitig erstellen müssen, ist es effizienter, einen größeren Speicherblock im Voraus zuzuordnen und jedes neue Objekt mit einem Segment dieses Blocks zu erstellen.

In verwalteten Sprachen wie C# ist dies bereits für Sie erledigt. Wenn Sie nach 64 Bytes Speicher fragen, ordnet das Framework einen ganzen Block zu und gibt Ihnen 64 Bytes aus diesem Block (oder einem anderen zuvor zugewiesenen Block).

+1

Ich glaube nicht, dass dein erster Satz wahr ist Joel. Das Betriebssystem wird den Malloc-Aufruf unabhängig von der Seitengröße geben. 4k für Intel? Also wirst du mindestens 4k bekommen. –

Verwandte Themen