Означает ли «предоставление хранилища» быть «представлением объекта»?C++

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

Сообщение Anonymous »

Рассмотрим этот код:

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

auto buffer = new unsigned char[MAX_LEN];
auto hdr1 = new (buffer) Header1{ /* ... */ };
size_t pos1 = sizeof(Header1);
auto hdr2 = new (buffer + pos1) Header2{ /* ... */ };
size_t pos2 = pos1 + sizeof(Header2);
hdr2->data_len = fread(buffer + pos2, 1, MAX_LEN - pos2, stdin);
network_sendto(peer, buffer, pos2 + hdr2->data_len);
Код предназначен для отправки в сеть объектного представления Header1, за которым следует представление Header2, а затем пользовательские данные.
В текущем стандарте говорится следующее ([basic.types.general]):

объектное представление полного типа объекта T – это последовательность N без знака. char, занятые полным объектом без битового поля типа T, где N равно sizeof(T). Представление значения типа T — это ...... Объект и представление значения полного объекта без битового поля типа T — это соответственно байты и биты объекта, соответствующие объекту и представлению значения его типа. ......

Если я правильно понимаю, как только буфер обеспечивает хранение заголовка, его часть («последовательность N unsigned char object") автоматически становится объектным представлением заголовка. Поэтому я думаю, что код действителен.
И пример кода в конце этого ответа, похоже, тоже согласен.
  • Правильно ли приведенное выше рассуждение ? Проявляет ли код UB в некоторых аспектах?
  • Мне также хотелось бы знать, будет ли он по-прежнему действителен, если P1839 войдет в стандарт. Потому что эта статья, похоже, затрагивает определение представления объекта.


Подробнее здесь: https://stackoverflow.com/questions/793 ... esentation
Ответить

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

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

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

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

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