Код: Выделить всё
#include
#include
template
void serialize(T const& source, unsigned char* buffer) {
std::memcpy(buffer, &source, sizeof(T));
}
template
T deserialize(unsigned char* buffer) {
T entity;
std::memcpy(&entity, buffer, sizeof(T));
return entity;
}
template
T* view_as(unsigned char* buffer) {
return reinterpret_cast(buffer);
}
struct point {
int x;
int y;
};
int main() {
point p1{1,2};
point p2{3,4};
alignas(point) unsigned char buffer[2 * sizeof(point)];
// These calls should be fine as we are copying trivally copyable types to a correctly aligned buffer
serialize(p1, buffer);
serialize(p2, buffer + sizeof(point));
// I believe memcpying a buffer to an object that has its lifetime started is valid
auto p3 = deserialize
(buffer);
auto p4 = deserialize(buffer + sizeof(point));
// As I copied these in and they were originally valid objects can I do the following 2 lines safely
auto* p5 = view_as(buffer);
auto* p6 = view_as(buffer + sizeof(point));
return 0;
}
< /code>
Я взял несколько исключений из стандарта C ++ 17 вокруг доступа к значению объекта с указателем на другой тип, который здесь указан. не определен: 63 < /sup> < /p>
[list]
[*](11.1) Динамический тип объекта, < /li>
li>(11.2) CV-квалифицированная версия динамического типа объекта, < /li>
•111.3) Тип динамического (как определенно 7.5). Объект, < /li>
(11.4) Тип, который является подписанным или неподписанным типом, соответствующим динамическому типу объекта, < /li>
(11.5) Тип, который является подписанным или не знаком Тип, который включает в себя один из вышеупомянутых типов среди его элементов или не
Static Data Memport (включая, рекурсивно, элемент или нестатический член данных субагрегата или
, содержащий Union), < /li>
функциональный класс. char, unsigned char или std :: byte type.
[/list]
Когда значение записывается через std :: memcpy Подробнее здесь: https://stackoverflow.com/questions/795 ... rpret-cast