Код: Выделить всё
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);
В текущем стандарте говорится следующее ([basic.types.general]):
объектное представление полного типа объекта T – это последовательность N без знака. char, занятые полным объектом без битового поля типа T, где N равно sizeof(T). Представление значения типа T — это ...... Объект и представление значения полного объекта без битового поля типа T — это соответственно байты и биты объекта, соответствующие объекту и представлению значения его типа. ......
Если я правильно понимаю, как только буфер обеспечивает хранение заголовка, его часть («последовательность N unsigned char object") автоматически становится объектным представлением заголовка. Поэтому я думаю, что код действителен.
И пример кода в конце этого ответа, похоже, тоже согласен.
- Правильно ли приведенное выше рассуждение ? Проявляет ли код UB в некоторых аспектах?
- Мне также хотелось бы знать, будет ли он по-прежнему действителен, если P1839 войдет в стандарт. Потому что эта статья, похоже, затрагивает определение представления объекта.
Подробнее здесь: https://stackoverflow.com/questions/793 ... esentation
Мобильная версия