Laden...

Was bedeutet LayoutKind.Sequentiell bzw. Explicit bei Structs?

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.573 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
Was bedeutet LayoutKind.Sequentiell bzw. Explicit bei Structs?

https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

das ist der offizielle Link dazu. Leider verstehe ich nicht so ganz genau was da gemeint ist.

Also soweit ich das verstanden habe, sollten doch Structs aufm Stack liegen, nicht im Heap.

Was ist laut MS unverwalteter Speicher ? Müßte doch Heap sein ?

16.807 Beiträge seit 2008
vor 5 Jahren

Wenn der Struct alleine steht, dann ist es aufm Stack.
Verwendest Du ein Struct zB. innerhalb einer Klasse als Eigenschaft, oder als Wert in einer Liste dann liegts auf dem Heap.
Beides ist in .NET jedoch aus Entwicklersicht verwaltet Speicher.

Gleiches gilt für int und Co.

5.657 Beiträge seit 2006
vor 5 Jahren

Hi Glowhollow,

als Faustregel: Wenn du nur in .NET entwickelst, brauchst du dich nicht darum zu kümmern, und kannst das Attribut wieder vergessen. Wenn du ein Programm mit C oder C++ schreibst, und mit einem .NET-Programm auf dessen Speicherinhalt zugreifen möchtest, dann kannst du hiermit dem Speichermanagement mitteilen, wie die einzelnen Felder der Struct im Speicher angeordnet sind.

Weeks of programming can save you hours of planning

C
2.121 Beiträge seit 2010
vor 5 Jahren

Diese Angaben haben nichts mit Stack oder Heap zu tun. Die definieren bildlich gesagt, ob zwischen den Feldern Lücken gelassen werden, wenn das den Zugriff auf die einzelnen Felder vereinfacht.

W
872 Beiträge seit 2005
vor 5 Jahren

Unverwalteter Speicher ist Speicher, der nicht mit dem Garbage Collector überwacht wird.
Den bekommst Du entweder mit GCHandle.Alloc oder wenn Du mittels P/Invoke externen Code ausführst und Du dann einen Zeiger auf einen Speicherbereich bekommst.

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo Glowhollow,

Leider verstehe ich nicht so ganz genau was da gemeint ist.

Als Hintergrund: Data structure alignment
Es geht darum wie die Felder des Structs (das Attribut kann übrigens auch für Klassen verwendet werden) im Speicher angeordnet sind und ob es dem Compiler gestattet ist zwischen den Felder Padding einzufügen oder nicht.

Ein Nutzen ist Interop mit nativem Code, bei dem die Feldanordnung fix gegeben ist.

Ein weitere Nutzen ist Optimierung, da so die Felder "aligned" werden können und das bietet u.U. besseren Speicherzugriff und/oder kleinere Structs und somit weniger Speicherverbrauch (der u.U. in weniger Arbeit für den GC resultieren kann, falls das Struct in einem Object (Klasse od. durch Boxing) verwendet wird, da es dann auf dem Heap landet).
Dieser Nutzen ist aber "premature optimization is the root of all evil" und sollte daher nur durch ausreichendes Profiling angewandt werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"