Великолепие и краткость со структурой массивов в отличие от массива структур

Предположим, мне нужно держать некоторые данные, состоящие из n Foos, n Barс и н Bazs. Элементы соответствующих индексов связаны между собой, поэтому вы также можете рассматривать эти данные как n триплетов Foo, Bar andBaz`. Первое описание данных — это «структура массивов», второе — «массив структур»; Вы можете найти обсуждение из этих двух макетов здесь, на StackOverflow.

Теперь, если мы знаем n во время компиляции, ваши фиджеры довольно легко выражают оба восприятия в C ++.

Массив структур (AoS):

struct {
Foo foo;
Bar bar;
Baz baz;
} aos_form[n];

Структура массивов (SoA):

struct {
Foo foo[n];
Bar bar[n];
Baz baz[n];
} soa_form;

но учтите, что мы уже нарушаем принцип СУХОГО, когда говорим n три раза. Это значительно усугубляется, если мы теперь хотим динамически распределять память для наших данных — скажем, с std::unique_ptrs:

Массив структур (AoS):

struct {
Foo foo;
Bar bar;
Baz baz;
} data_tuple_t;
auto aos_form = std::make_unique<data_tuple_t[]>(n);

достаточно разумно, хотя нам, похоже, сейчас нужно определение типа. Но как насчет SoA? Что ж,

Структура массивов (SoA):

struct {
std::unique_ptr<Foo[]> foo;
std::unique_ptr<Bar[]> bar;
std::unique_ptr<Bas[]> baz;
} soa_form = {
std::make_unique<Foo[]>(n),
std::make_unique<Bar[]>(n),
std::make_unique<Baz[]>(n)
}

Теперь это просто ужасно! Мы повторяем 3 разных способа:

  • Задание типа поля дважды — в определении типа и в присваивании
  • Необходимость быть «многословным», а не «непрозрачным» или «неявным» как в определении, так и в инициализации.
  • Нужно указать длину трижды.

Кроме написания специально настроенного класса, что я могу сделать проще и в целом, чтобы сделать Soa FORM «легче для глаз» (и для пальцев)?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]