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

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

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

44 ответов

14 просмотров

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

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 без вариантов...

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта