Массив структур или одна структура с массивом для каждого из его свойств - PullRequest
1 голос
/ 18 февраля 2010

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

Какой способ лучше для производительности и лучше для библиотеки API / классов?

Спасибо

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

ИМХО, вам следует создать массив структур, несмотря на то, что вы получаете удар по производительности за создание экземпляров всех структур.Организационный смысл того, что одно состояние хранится в одной структуре, намного перевешивает потерю производительности, а использование одной структуры с кучей массивов и простое назначение каждому процессу индекса в ряде массивов очень грязно и может быть огромной болью для отладки..

1 голос
/ 18 февраля 2010

Вы можете рассмотреть возможность использования class вместо struct, и я буду использовать список классов.

0 голосов
/ 25 января 2011

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

Более интересный вопрос - как выставить данные.Если вы представляете структуру в качестве индексатора, любой, кто хочет изменить поле структуры, должен будет прочитать структуру, изменить поле во временной копии и записать его обратно.Вы можете предоставить методы для чтения / записи отдельных свойств, но «foo.setBar (100, 23)» кажется менее естественным, чем «foo (100) .Bar = 23».Если бы был разрешен последний синтаксис, я бы предложил, чтобы индексатор возвращал структуру с двумя закрытыми полями, «root» и «index», и свойствами для каждого поля структуры, например, для установщика свойства Bar индексатора.будет выполнять root.setBar (индекс, значение).Индексатор также должен иметь свойство asWhwhatStructType для получения / установки структуры в целом.

0 голосов
/ 18 февраля 2010

У Эрика Липперта есть несколько аргументов против использования массивов в API. Одним из наиболее убедительных для меня является то, почему вы хотите сохранить фиксированный размер коллекции, но разрешить потребителям изменять содержимое. Вы можете увидеть больше здесь .

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

...