Неопределенное поведение и переосмыслить_КАС [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неопределенное поведение и переосмыслить_КАС [закрыто]

Сообщение Anonymous »

Я хотел бы понять более подробно, когда 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 Mements (включая, рекурсивно, элемент или нестатический элемент данных субагрегата или
, содержащий Union), < /li>
функциональный класс. char, unsigned char или std :: byte type.
[/list]

Когда значение записывается через std :: memcpy 
, как показано в коде выше, является неопределенным поведением, чтобы позже прочитать его с помощью повторного интерпретации, как показано в примере с примером view_as . Как лучше всего получить оптимальную производительность и безопасность, если это возможно?


Подробнее здесь: https://stackoverflow.com/questions/795 ... rpret-cast
Ответить

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

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

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

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

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