Оптимальное решение для структуры объемом более 16 байт

StackOverflow https://stackoverflow.com/questions/410611

  •  03-07-2019
  •  | 
  •  

Вопрос

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

  • Он представляет собой единственное значение
  • Это непреложно

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

Итак, какое решение я должен использовать для этого типа?

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

Редактировать

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top