170 похожих чатов

Наверно я дурак и не правильно вопрос поставил изначально. Имеет ли

право компилятор напихать че своего в начало памяти занимаемой экземпляром класса, в его середину.
Перемешать поля местами и тп?

44 ответов

4 просмотра

Имеет. Паддинг, выравнивание

SetPf- Автор вопроса
Ilya Zviagin
Имеет. Паддинг, выравнивание

Паддинг в расчет не берем - его можно руками задать вроде и точно знать.

Перемешать поля может, но это если такой компилятор или если установлен макрос #pack, в gcc по умолчанию не мешает местами

רחפ
Перемешать поля может, но это если такой компилято...

Это опять мимо стандартных , как это -- ХОРОШИХ в общем программ. #pack -- это прагма, НЕ стандартная.

רחפ
Перемешать поля может, но это если такой компилято...

ГЛАВНОЕ: нафига так бегать в структуре от байта к байту, если можно достаточно легко вычислить байтовое смещение каждого члена структуры относительно базового адреса, и уже по этому смещению обращаться?

SetPf- Автор вопроса
SetPf- Автор вопроса
Ilya Zviagin
И ?

Да нет уже и - понятно. Просто так бы пихал побайтно от и до конца. А так надо морочится.

SetPf
Да нет уже и - понятно. Просто так бы пихал побай...

чё там морочится? написал один раз функцию вычисляющую смещение мембера -- и всё. Да и наверняка есть такая уже либо в бусте, либо в стандарте

Ilya Zviagin
ГЛАВНОЕ: нафига так бегать в структуре от байта к ...

Ок, тогда если допустим, есть тип void*, метод принимает этот тип. И чтобы распарсить этот тип как структуру, то есть вытащить данные из void* в другие переменные. То здесь ведь будет работать способ (база + sizeof(тип)) и так далее присваивать и прибавлять?

רחפ
Ок, тогда если допустим, есть тип void*, метод при...

Это вообще невозможно, *(void*) -- не тип

Ilya Zviagin
Это вообще невозможно, *(void*) -- не тип

Точнее указатель), то есть при вызове метода подавался как (void*)структура.

רחפ
Ок, тогда если допустим, есть тип void*, метод при...

И вообще что это значит распарсить этот тип как структуру -- структура не текст, чтобы её парсить. Это уже готовая форма в памяти

Ilya Zviagin
И вообще что это значит распарсить этот тип как ст...

Имеется в виду создать прототип структуры с другим именем, то есть мы не знаем имя предыдущей, только порядок типов, и в нее считать данные используя в основе только указатель void* и смещение.

Kirill Bolshakov
Это не про ODR, но всё равно UB

Как не про ODR? Тип был один, а тут этот же образ объекта в памяти мы будем обрабатывать как другой тип

Ilya Zviagin
Как не про ODR? Тип был один, а тут этот же образ ...

Ну это не про ODR, ODR это если бы имя у типа было одно, а поля разные

Ilya Zviagin
Как не про ODR? Тип был один, а тут этот же образ ...

если это нарушение odr, то чем будет нарушение strict aliasing?

Vlad
если это нарушение odr, то чем будет нарушение str...

Ну, если он угадает с адресом члена данных, а с типом не угадает , вот будет оно

Ilya Zviagin
Ну, если он угадает с адресом члена данных, а с ти...

и когда он не угадывает с типом, то «тип был один, а тут этот же образ объекта в памяти мы будем обрабатывать как другой тип»

В начало нет. Перемешивать секции между собой имеет, всталять что-то между секциями имеет

Ilya Zviagin
Это вообще невозможно, *(void*) -- не тип

Только не void* - как минимум unsigned char, UB ибо в общем случае как оно лежит в памяти решает компилятор и ни кто не гарантирует одно и то же поведение на каждой существующей в природе платформе.

Dmitriy [Отпуск]
Откуда UB?

Порядок байтов, правила выравнивания, даже размер integer зависят от платформы.

Dmitriy [Отпуск]
Еще раз: как это с кастом в void* связано?)

На конкретной платформе зная внутреннее устройство платформы, памяти и процессора платформы работать можно. В стандарт все случаи записать нельзя - по этому UB

Mikhail Kalugin
Только не void* - как минимум unsigned char, UB иб...

Каст T* -> void* (если T является object type) никакого уб не имеет

Artöm Bakri Al-Sarmini
Каст T* -> void* (если T является object type) ник...

А обратно и потом ходить по структуре?

Artöm Bakri Al-Sarmini
Обратно тоже defined

Нет, в общем случае (если байты брались извне).

Artöm Bakri Al-Sarmini
Обратно тоже defined

Каст T*->void*->T* определен в рамках одной платформы.

Mikhail Kalugin
Нет, в общем случае (если байты брались извне).

Если байты брались извне, никакого объекта там нет и говорить не о чем

Artöm Bakri Al-Sarmini
Очевидно

Штука в том, что как оно выглядит в памяти исключительно на совести разработчика компилятора и просто так ходить по нему можно, но только если точно знаешь что делаешь. Причем ходить по void* нельзя (какой у void размер?).

Mikhail Kalugin
Штука в том, что как оно выглядит в памяти исключи...

Про ходьбу по воид никто не говорил. Никто не говорил, что прибавив N байт к началу ТС получит нужное поле на всех платформах

Mikhail Kalugin
Штука в том, что как оно выглядит в памяти исключи...

Вопрос был про реордеринг, ответ вроде как получен

Mikhail Kalugin
На конкретной платформе зная внутреннее устройство...

Тогда уж implementation defined было бы более подходящим...

disba1ancer
Тогда уж implementation defined было бы более подх...

Да, скорее всего так. UB это скорее для случаев когда неизвестно что будет происходить даже в рамках одной платформы.

Mikhail Kalugin
Да, скорее всего так. UB это скорее для случаев ко...

Но у меня есть опасения что в стандарте это всё UB без вариантов...

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Добрый день! Такая проблема возникла, написал код на Python, который компилирует, собирает и запускает файлы .s А в случае работы нужно то же самое делать для .asm Чем эти фа...
A Mori
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Карта сайта