Изменение представления объекта при наличии битов заполненияC++

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

Сообщение Anonymous »

Этот вопрос является продолжением заполнения std::bit_cast и неопределенного поведения. Это «возрождение» мотивировано моим ответом на «Доступ к хранилищу объектов», где я предложил функцию для изменения данного байта объекта, пытаясь избежать неопределенного поведения:

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

#include 
#include 
#include 
#include 

template 
concept trivially_copyable = std::is_trivially_copyable_v;

namespace details {
// required to pass a plain array to and from bit_cast
template 
struct wrap_array {
T arr[N];
};
}  // namespace details

template 
constexpr void set_byte(T& obj, std::size_t pos, std::byte val) {
details::wrap_array obj_rep;
// static only with c++>=23
// static details::wrap_array obj_rep;
obj_rep = std::bit_cast(obj);
if (pos >= sizeof(T)) {
return;
}
obj_rep.arr[pos] = val;
obj = std::bit_cast(obj_rep);
}
Глядя на это, я вспомнил первый связанный вопрос, на который у меня не было однозначного ответа.
Мне интересно, определен ли этот фрагмент для структур с заполнением, таких как предложенный в этом вопросе (вопрос будет таким же для структуры с битовыми полями):

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

#include 
struct S40 {
std::uint8_t a = 0x51;
std::uint32_t b = 0xa353c0f1;
};
Я углубился в стандарт.
Согласно последней версии std::bit_cast:

Если u имеет тип беззнакового обычного символа или тип std::byte, u имеет неопределенное значение, если какой-либо из битов в его представлении значения неопределенен или иным образом имеет ошибочное значение.
/>
Итак, первый std::bit_cast выше создает некоторые std::bytes с неопределенными значениями.
Подпадает ли он под исключения в Basic.indet, оставляя программу в определенном состоянии и позволяя читать это значение, даже если оно неопределенное?
Сделаем еще один шаг вперед, если я изменю байт, содержащий неопределенное значение (теперь давая ему определенный) и выполните второй std::bit_cast, https://eel.is/c++draft/bit.cast#4 дает, что бит заполнения возвращаемой структуры «не указан», но я не могу найти определение этой концепции в этом контексте (возможно, неуказанное поведение, которое говорило бы, что программа правильно сформирована, но точный результат зависит от фактической реализации).
Действительна ли полученная структура в то время как представление значения соответствует допустимому для типа? Без неопределенного поведения?
Моя цель — убедиться, что функция действительна, когда я хочу изменить только байты, участвующие в представлении значения (но они могут содержать неопределенные биты, в случае битового поля). Если я попытаюсь изменить байты/биты заполнения, я ожидаю, что значение объекта останется неизменным и программа будет работать нормально.

Подробнее здесь: https://stackoverflow.com/questions/798 ... dding-bits
Ответить

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

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

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

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

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