Отображение памяти одного вектора на другой - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть вектор двоичных данных, используемый некоторым промежуточным программным обеспечением

std::vector<uint> data

Данные внутри этого вектора отображаются в класс Foo в основном так:

|uint|uint|uint|uint|uint|uint|uint|uint|uint|
|    F o o     |    F o o     |    F o o     |

Использование специального распределителя размещения (как описано здесь Могу ли я использовать std :: vector в качестве фасада для предварительно выделенного (необработанного) массива? ) Теперь я могу отобразить память первоговектор к вектору типа std::vector<Foo>

Но если я оперирую вторым вектором, размер первого не будет обновлен.

Другой подход заключается в инкапсуляции первого вектора std::vector<uint8> в пользовательском контейнере, который ведет себя как std::vector<Foo>, но это много усилий (и я не могу использовать Boost).

Есть идеи для элегантного решения?

1 Ответ

0 голосов
/ 15 ноября 2018

Ситуация очень отличается от связанного вопроса. Вы не имеете дело с предварительно выделенным хранилищем, у вас уже есть данные для объектов. Кроме того, вы хотите, чтобы обе стороны могли изменять вектор или, другими словами, они совместно владели.

Это не тривиально. Вы можете предоставить «класс представления», который предлагает другой набор операций с тем же вектором или предлагает то же самое для семейства свободных функций. В любом случае они должны иметь ссылочную семантику.

Пример бесплатной функции

template<typename T>
void push_back_foo(std::vector<uint8_t>& vec, T&& t)
{
    auto it = vec.insert(vec.end(), sizeof(Foo), {});
    new (&*it) Foo{std::forward<T>(t)};
}

И так далее для всех других функций. Они отображают операции на стороне Foo на операции на стороне uint8_t.

Примечание: выполнение арифметики с указателем для результирующего вектора является формально неопределенным поведением, поскольку там нет массива Foo. При работе с наложением двоичных данных на фасад обычно понимается, что компиляторы не сожгут ваш дом, и такие формальности игнорируются.

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