Должен ли я использовать LayoutKind.Auto для своих структур, если они не работают в COM Interop? - PullRequest
4 голосов
/ 29 ноября 2009

По умолчанию структуры в C # реализованы с [StructLayout( LayoutKind.Sequential )] по причинам, в основном утверждающим, что эти типы объектов обычно используются для взаимодействия COM, и их поля должны оставаться в том порядке, в котором они были определены. Классы определены LayoutKind.Auto.

Мой вопрос заключается в том, должен ли я явно указывать свои структуры как [StructLayout( LayoutKind.Auto )] и даст ли это мне какие-либо преимущества по умолчанию? Я имею в виду, что если структуры инициализируются в стеке , будет ли это иметь какое-то значение - то есть GC не должен их перемещать? Также поможет ли это, когда структуры инициализируются в куче - т.е. являются частью какого-то класса?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2009

Единственное возможное преимущество, о котором я могу подумать, это то, что ваша структура занимает меньше памяти. Но если у вас такая большая структура, вы должны вероятно преобразовать ее в класс.

Потенциальная проблема заключается в том, что вы хотите преобразовать ваш struct в byte[] с использованием Marshal.PtrToStructure, как вы можете гарантировать, что порядок байтов будет таким, как вы ожидаете?

Делая это, кажется, вы представляете больше возможных проблем, чем тех, которые решаете ... При этом, если порядок полей в никогда не важен для вас , тогда сделайте это, но имейте в виду, что следующий человек, который придет один, может не ожидать этого.

1 голос
/ 29 ноября 2009

Это может принести вам пользу, хотя я не думаю, что это будет много. Я обычно придерживаюсь значений по умолчанию.

По сути, с помощью автоматической компоновки CLR может выбрать способ выравнивания данных, поэтому, возможно, будет сделан некоторый компромисс между скоростью и скоростью (это также будет зависеть от платформы, в некоторых случаях сохранение выравнивания может быть более важным, чем в других). Однако, поскольку структуры также часто используются в стеке или в качестве составных вспомогательных структур (например, KeyValuePair), последовательные обычно имеют смысл по умолчанию.

...