указателю на другую, если у них одинаковые поля?
Предположим, компиляция происходит в рамках одного проекта одним компилятором с одинаковыми настройками
Да вроде, мы же не в Си)
если это два никак не связанных типа, что, видимо, так, то да
Вот это уже интереснее: в Си - не УБ?
Насколько я знаю я нет
в отличие от многого другого, касты определены как исчерпывающий список разрешенных преобразований, так что с ними довольно просто
То есть, один и тот же компилятор может их (типы) создать по-разному?
Благодарю)
ничто ему не запрещает, насколько я знаю как мысленный эксперимент могу предложить случайное добавление padding байтов в типы, что делает их разными внутри, но не влияет на наблюдаемое поведение
Тогда следующий вопрос. Допустим, у нас есть некоторая struct Data (POD, конечно), определенная в общем хедере. Я её побайтово сериализую в буфер, и, например, отправляю его в драйвер ядра. Исходники драйвера используют тот же самый хедер с определением структуры. Можно ли кастить указатель на буфер к Data* при одинаковых настройках выравнивания при компиляции драйвера и пользовательского приложения?
Конечно это УБ.
Это можно точно, потому что буфер был получен изначально как память именно этого типа данных
1) pod понятие не очень точное для текущего стандарта. в этом случае требование звучит как trivially copyable 2) сразу кастить указатель на буфер к указателю на Data нельзя. надо создать объект Data сначала
И скопировать в него буфер?
Да, будем считать trivially copyable
Так он туда будет его копировать.
Но про выравнивание я неслучайно уточнил...
Ну это чисто формально, под стандарту чтобы типа там началась время жизни этого объекта. Фактически это не нужно. (Если pod у нас)
Ты вроде как хотел копировать туда, при чем тут выравнивание?
Можно даже не копировать, а передать указатель на объект структуры в качестве указателя на буфер
Например, в VS для usermode-приложений стоит автоматическое определение выравнивания. Для дров по умолчанию указано 8. Понятно, что мы должны чекнуть размер буфера , но вдруг структур в буфере будет несколько и его общий размер окажется кратным размеру структуры, ожидаемому драйвером - получим неприятности
да если выравнивание и размеры совпадают, то объект получит нужное вам значение, которое соответствует представлению (байтам), которое вы копируете
А что за автоматическое выравнивание, если оно вообще не обязательное на интеле?
Например, структура из набора int/short/char будет выровнена по 4б, а не 8
Стандарт вроде бы это не определяет
Обсуждают сегодня