4 votes

Dois-je utiliser LayoutKind.Auto pour mes structs s'ils ne fonctionnent pas dans COM Interop ?

Par défaut structures en C# sont implémentées avec [StructLayout( LayoutKind.Sequential )] pour des raisons essentiellement liées au fait que ce type d'objets est couramment utilisé pour COM Interop et que leurs champs doivent rester dans l'ordre où ils ont été définis. Les classes ont LayoutKind.Auto défini.

Ma question est de savoir si je dois déclarer explicitement mes structures comme étant [StructLayout( LayoutKind.Auto )] et cela me donnerait-il des avantages par rapport à la version par défaut ? Je veux dire que si les structs sont initialisés sur pile Est-ce que cela fera une différence ? GC n'a pas à les déplacer ? De même, cela sera-t-il utile lorsque les structs sont initialisés sur le tas, c'est-à-dire lorsqu'ils font partie d'une classe ?

2voto

ParmesanCodice Points 3339

Le seul avantage possible auquel je peux penser est que votre structure occupera moins de mémoire. Mais si vous avez une structure aussi grande, vous devriez probablement le refactoriser en une classe.

Un problème potentiel est que si vous voulez Marshall votre struct en un byte[] en utilisant Marshal.PtrToStructure comment pouvez-vous garantir que l'ordre des octets sera conforme à vos attentes ?

En faisant cela, on a l'impression d'introduire plus de problèmes possibles que ceux que l'on résout... Ceci étant dit, si l'ordre des champs dans le fichier jamais important pour vous Alors, faites-le, mais n'oubliez pas que la prochaine personne qui viendra seule ne s'y attendra peut-être pas.

1voto

Lucero Points 38928

Cela peut vous apporter des avantages, même si je ne pense pas que cela fasse grand-chose. Je m'en tiens généralement aux valeurs par défaut.

Fondamentalement, avec une disposition automatique, le CLR peut choisir comment aligner les données, et donc peut-être faire quelques compromis d'espace pour la vitesse (cela dépendra aussi de la plate-forme, garder les choses alignées peut être plus important dans certaines que dans d'autres). Cependant, étant donné que les structs sont aussi souvent utilisés sur la pile ou comme structures d'aide composites (pensez à KeyValuePair), le séquentiel a généralement du sens par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X