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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

Не могли бы вы предоставить дополнительную информацию.

Lawrence Dol 04.01.2009 10:58

Будущим читателям было бы полезно, если бы вы могли включить в вопрос, почему 6 полей int являются проблемой. Возможно, это общеизвестно для пользователей C#, но для меня это не очевидно.

slim 04.01.2009 12:13

@Software Monkey: это треугольник. Поля: sideA, sideB, sideC, size, seed1, seed2.

Chaowlert Chaisrichalermpol 04.01.2009 13:29

@slim: Спасибо. Я отредактировал свой вопрос.

Chaowlert Chaisrichalermpol 04.01.2009 13:33

Простите мой опыт работы с C и незнание C#, но разве вы не передаете ответ по ссылке?

slim 04.01.2009 15:12

@slim: в C# мы обычно передаем по значению.

Chaowlert Chaisrichalermpol 04.01.2009 17:25

В C также обычно используется значение. Но чтобы избежать копирования больших объемов данных, вы передаете указатели.

slim 04.01.2009 18:03

@slim: да, тонкий, но при использовании указателей в C# мы должны отмечать методы как небезопасные, что не поощряется в C#.

Chaowlert Chaisrichalermpol 05.01.2009 07:58

На самом деле это просто соглашение о передаче по значению. Передача по ссылке требует использования ключевого слова ref на каждом сайте вызова; таким образом, дизайн языка настоятельно поощряет передачу по значению. Накладные расходы на объект составляют 8 байтов, поэтому, если ваш тип составляет 24 байта, почти всегда лучше просто заплатить 25% накладных расходов.

Qwertie 05.11.2009 19:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
9
819
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

@ Дмитрий Нестерук: не могли бы вы объяснить?

Mitch Wheat 04.01.2009 13:09
Ответ принят как подходящий

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

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

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

1. Передавать участок 2. Не использовать сторонний код 3. Нет 4. Нет

Chaowlert Chaisrichalermpol 04.01.2009 13:34

Мне кажется, что класс - это, вероятно, правильный выбор для вас. В основном это основано на вашем ответе на вопросы №1 и №3.

vboctor 06.01.2009 04:43

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

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

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

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

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

Думаю, вы упустили суть вопроса - дело не в том, нужно ли держать их вместе, а в том, использовать ли структуру или класс.

Jon Skeet 04.01.2009 12:16

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

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

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

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

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