Size: a a a

pro.graphon (and gamedev)

2020 October 20

K

Kirill in pro.graphon (and gamedev)
Кстати, в последнем то тоже наверняка нету C++20
источник

K

Kirill in pro.graphon (and gamedev)
disba1ancer
по правилам strict aliasing'а компилятор может доказать что 2 указателя указывают на разные объект и оптимизировать
Сейчас почитаю про это, что-то новое
источник

VD

Vlad Doc in pro.graphon (and gamedev)
disba1ancer
по правилам strict aliasing'а компилятор может доказать что 2 указателя указывают на разные объект и оптимизировать
Кастить в uint8_t* и обратно можно для trivially_copyable типов
источник

VD

Vlad Doc in pro.graphon (and gamedev)
Иначе бы каждый memcpy был бы УБ
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
Kirill
Кстати, в последнем то тоже наверняка нету C++20
О полной реализации я тоже не слышал. Какой clang идёт с qt creator для анализа - я не знаю
источник

K

Kirill in pro.graphon (and gamedev)
Anatoly Tomilov
О полной реализации я тоже не слышал. Какой clang идёт с qt creator для анализа - я не знаю
Восьмой
источник

d

disba1ancer in pro.graphon (and gamedev)
Kirill
всегда делаю каст в unsigned char - никогда UB не возникало
в основном определяют по типам указателей, но есть исключение для char типов (все три вида), std::byte и void, если встретится указатель на char и любой другой, компилятор может предполагать что указатели могут указывать на одно и тоже и не оптимизировать, если же указатель на char заменить указателем на char8_t то компилятор будет вправе считать что указатели всегда указывают на разные объекты
источник

d

disba1ancer in pro.graphon (and gamedev)
Vlad Doc
Кастить в uint8_t* и обратно можно для trivially_copyable типов
не uint8_t, а char
источник

d

disba1ancer in pro.graphon (and gamedev)
как я понял uint8_t не обязан иметь char под капотом
источник

K

Kirill in pro.graphon (and gamedev)
disba1ancer
в основном определяют по типам указателей, но есть исключение для char типов (все три вида), std::byte и void, если встретится указатель на char и любой другой, компилятор может предполагать что указатели могут указывать на одно и тоже и не оптимизировать, если же указатель на char заменить указателем на char8_t то компилятор будет вправе считать что указатели всегда указывают на разные объекты
А в чём будет заключаться оптимизация?
источник

d

disba1ancer in pro.graphon (and gamedev)
Kirill
А в чём будет заключаться оптимизация?
ну например, после каждого изменения значения по одному указателю компилятору не нужно будет перечитывать значение по другому указателю
источник

K

Kirill in pro.graphon (and gamedev)
disba1ancer
ну например, после каждого изменения значения по одному указателю компилятору не нужно будет перечитывать значение по другому указателю
Ну и пусть оптимизирует, почему это UB?
источник

K

Kirill in pro.graphon (and gamedev)
Или я что то не так понял...
источник

d

disba1ancer in pro.graphon (and gamedev)
Kirill
Ну и пусть оптимизирует, почему это UB?
в некоторых случаях оптимизация совершенно не то чего ты хочешь
источник

K

Kirill in pro.graphon (and gamedev)
disba1ancer
в некоторых случаях оптимизация совершенно не то чего ты хочешь
Если два разных указателя действительно указывают на одну память - то это ведь не должно приводить к UB
источник

d

disba1ancer in pro.graphon (and gamedev)
Kirill
Если два разных указателя действительно указывают на одну память - то это ведь не должно приводить к UB
если они указывают на одну и туже память, но имеют разные типы это и есть нарушение алиасинга и является UB
источник

d

disba1ancer in pro.graphon (and gamedev)
исключение если у тебя union
источник

K

Kirill in pro.graphon (and gamedev)
disba1ancer
если они указывают на одну и туже память, но имеют разные типы это и есть нарушение алиасинга и является UB
Имеешь ввиду, что если есть два указателя, грубо говоря char и int16_t, то компилятор может оптимизировать их так, что после обновления char он обновит только первый байт int16_t? Что-то я вообще запутался
источник

K

Kirill in pro.graphon (and gamedev)
Кажется фигню написал
источник

d

disba1ancer in pro.graphon (and gamedev)
Kirill
Имеешь ввиду, что если есть два указателя, грубо говоря char и int16_t, то компилятор может оптимизировать их так, что после обновления char он обновит только первый байт int16_t? Что-то я вообще запутался
тут связано с кешированием значений в регистрах
источник