Оптимальное решение для структуры с более чем 16 байтами - PullRequest
3 голосов
/ 04 января 2009

У меня есть тип, который я считаю использовать его в качестве структуры.

  • Представляет одно значение
  • Неизменен

Но проблема в том, что у него есть 6 полей типа int.

Так какое решение мне следует использовать для этого типа?

  1. продолжать использовать struct?
  2. перейти в класс?
  3. или упакуйте 6 целых чисел в массив int, поэтому в нем только одно поле

EDIT

Размер структуры с 6 целочисленными полями составляет 24 байта, что является огромным, чтобы обойти. Рекомендуемый размер для структуры не более 16 байт

Ответы [ 7 ]

5 голосов
/ 04 января 2009

Зависит от того, как вы собираетесь его использовать?

  1. Собираетесь ли вы распределить многое по сравнению с большим количеством раздач?
  2. Будет ли он использоваться сторонним кодом? В этом случае занятия обычно дают вам больше гибкости.
  3. Вы хотите, чтобы структура против семантики класса? Например, не обнуляется?
  4. Будет ли вам полезно иметь пару предварительно созданных экземпляров этого класса, которые можно использовать повторно для представления особых случаев? Похож на String.Empty. В этом случае вы получите пользу от класса.

Трудно ответить только на основании информации, которую вы указали в своем вопросе.

1 голос
/ 04 января 2009

Будьте осторожны с боксом. Если ваша структура будет использоваться методом, который ожидает объект, она будет приведена к объекту, и вы получите потенциальный удар по производительности.

Вот ссылка , которая объясняет это более подробно.

Я бы сделал это классом (# 2), и тогда тебе не пришлось бы об этом беспокоиться.

Использование массива из шести целых чисел (# 3), вероятно, затруднит чтение вашего кода. Класс с описательными идентификаторами для каждого типа int будет намного лучше.

0 голосов
/ 06 октября 2011

Если держатель данных будет неизменным, вопрос о структуре и классе, скорее всего, будет зависеть от среднего числа ссылок, которые будут существовать для каждого экземпляра. Если у одного есть массив TwentyFourByteStruct [1000], этот массив будет занимать 24 000 байтов, независимо от того, имеет ли каждый элемент различное значение, все элементы имеют одинаковое значение или где-то между ними. Если у вас есть массив TwentyFourByteClass [1000], этот массив займет 4000 или 8000 байт (для 32/64-разрядных систем), а каждый отдельный экземпляр TwentyFourByteClass, который создается, займет около 48 байт. Если все элементы массива содержат ссылку на один и тот же объект TwentyFourByteClass, общий объем составит 4 048 или 8 048 байт. Если все элементы массива содержат ссылки на разные объекты TwentyFourByteClass, общий объем составит 52 000 или 56 000 байт.

Что касается производительности во время выполнения, лучшая производительность, которую вы можете получить, - это, как правило, передача структур по ссылке. Передача структур по значению потребует их копирования, что может дорого обойтись для структур размером более 16 байт (.net включает в себя оптимизации для структур размером 16 байт или меньше), но стоимость типа значения по ссылке одинакова, независимо от того, равен ли он 1 байту или 16 000 байт.

0 голосов
/ 30 июня 2010

Я бы предложил написать небольшой тест для измерения производительности различных опций, это единственный способ узнать наверняка. Вы можете быть удивлены результатами (я часто так).

(Я предполагаю, что ваша проблема здесь в производительности.)

0 голосов
/ 04 января 2009

В общем, при хранении более двух частей связанных данных мне нравится создавать класс, который связывает их вместе. Особенно, если я буду раздавать их как единое целое.

0 голосов
/ 04 января 2009

Как насчет WriteOnce<int[]>?

0 голосов
/ 04 января 2009

Не видя вашей структуры, трудно сказать что-либо однозначно. Но я подозреваю, что вы должны оставить это как структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...