Получение массива времени выполнения с указателя на его хранилище?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Получение массива времени выполнения с указателя на его хранилище?

Сообщение Anonymous »

Когда был создан массив объектов типа t (без ограничений на t ) (неявно или явно) внутри хранилища, чье место памяти дается, например, void *, Unsigned char * или std :: byte * (давайте скажем ), как можно будет иметь оригинал. Хранение .
При использовании std :: raunder для извлечения t * pointer arr , похоже, мы получаем только указатель на один элемент: например, указатель арифметика больше не может быть использована (в теории, потому что, на практике, по крайней мере, я не могу использовать то, что ожидается). Чтобы произвести MRE, который мог бы проиллюстрировать действительный вариант использования, так что это бессмысленный пример, если только проиллюстрировать проблему: < /p>

Код: Выделить всё

#include 
#include 
#include 

template 
void process(void* storage, std::size_t n) {
T* arr = std::launder(reinterpret_cast(storage));  // (4)
// is arr the address of a single object or the address of the existing
// array
// (see usage in main)
// (5) can I use arr as an array (arr[0] ... arr[count-1] being valid and
// arr+count being the valid pointer to one past the last element)?
for (auto& el : std::span(arr, arr + n)) {
el = T{2};
}
}

int main(int argc, char**) {
std::size_t count = static_cast(10 * argc);
constexpr static std::size_t sz_in_bytes{1000};

// provides storage
alignas(double) std::byte storage[sz_in_bytes];  // (1)
// place an array of double inside storage
auto* darr = ::new (static_cast(storage)) double[count];  // (2)
for (auto& el : std::span(darr, darr + count)) {
el = double{1};
}

// process(storage, count);  // an offset might have been introduced
// at (2)
process(static_cast(darr), count);  // (3)

return static_cast(darr[3]);
}
live

[*] У меня есть некоторое хранилище;
[*] Я помещаю в него массив (из двойного здесь);
Я передаю массив в процесс в качестве указателя к его хранилищу (это может соответствовать схеме эразюры); Хочу вернуть указатель на массив двойного для его обработки. Цикл ub. < /p>
Как мы можем получить массив известного размера времени выполнения? Возможно ли это с std :: raunder ?

Код: Выделить всё

std::start_lifetime_as_array< /code> может быть вариантом, но он не будет работать с некоторыми другими типами (массив должен быть тривиально копируемым). < /p>

Запоздалая мысль: из эмуляции std :: start_lifetime_as_array в c ++ 20 и расслабляя ограничение на trivialliable: < /p>
T* arr = std::launder(reinterpret_cast(std::memmove(storage,storage,sizeof(T)*count));
Это неявно создает массив t (массивы всегда являются неявными типами времени жизни). И представление стоимости хранится от существующих байтов? Но под той же мысли, почему std :: raunder здесь получает массив вместо одного элемента?


Подробнее здесь: https://stackoverflow.com/questions/797 ... ts-storage
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»