Я хотел бы понять более подробно, когда Reinterpret_cast безопасен и когда это вызывает неопределенное поведение. Ниже приведена образец программы, которую я собрал для обсуждения. Я понимаю, что MEMCPY для существующего объекта определяется, но до тех пор, пока он Trivally_Copyable. Меня интересует, как Reinterpret_CASC хорошо определен или нет. < /P>
#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
, как показано в коде выше, является неопределенным поведением, чтобы позже прочитать его с помощью повторного интерпретации, как показано в примере с примером view_as . Как лучше всего получить оптимальную производительность и безопасность, если это возможно?
Я хотел бы понять более подробно, когда Reinterpret_cast безопасен и когда это вызывает неопределенное поведение. Ниже приведена образец программы, которую я собрал для обсуждения. Я понимаю, что MEMCPY для существующего объекта определяется, но до тех пор, пока он Trivally_Copyable. Меня интересует, как Reinterpret_CASC хорошо определен или нет. < /P> [code]#include #include
// 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 [/code], как показано в коде выше, является неопределенным поведением, чтобы позже прочитать его с помощью повторного интерпретации, как показано в примере с примером view_as . Как лучше всего получить оптимальную производительность и безопасность, если это возможно?