#include <cstdlib>
#include <cstring>
#include <iostream>
// C++03 only.
int main()
{
std::allocator<unsigned char> alloc;
double d = 8;
unsigned char* buf = alloc.allocate(sizeof(double));
std::memcpy(buf, &d, sizeof(double));
double extract;
std::memcpy(&extract, buf, sizeof(double));
std::cout << extract << '\n';
alloc.deallocate(buf, sizeof(double));
}
Я создал хранилище для массива байтов, которое я никогда не приводил в действие, инициализируя его, поэтому его время жизни никогда не начиналось (а в C ++ 03 это в принципе невозможно сделать, так как правильный путь сделать это путем размещения нового, но для массивов это добавляет смещение памяти, что вы не знаете, что это такое)
Но мне на самом деле не нужно «непосредственно читать» данные, которые в этом память, я делаю всю эту копию-вставку объектов с помощью std::memcpy
вызовов.
Я сомневаюсь со вторым вызовом std::memcpy
. С точки зрения доступа к значениям считается ли, что std::memcpy
читает значение каждого элемента массива buf
, поэтому этот массив должен быть жив?
ПРИМЕЧАНИЕ: Было предложено что этот вопрос является возможным клоном Можно ли использовать memcpy для типа punning? . Этот другой вопрос касается C, и этот вопрос также не относится к наказанию типов, хотя он связан (изначально я написал неправильное название вопроса, потому что я неправильно понял, что на самом деле означает наказание типов). Я спрашиваю здесь о точной семантике объекта чтения из, который передается в memcpy
, должен ли этот объект быть живым или на самом деле не требуется.