Size: a a a

2020 July 08

m

magras in pro.cxx
disba1ancer
там по ходу сработал strict aliasing и выкинулся ассерт как заведомо не срабатывающий
Да, этот пример именно это и должен был продемонстрировать.
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Pepe 🐸
а реально может сегфолтнуть? а то меня убеждают что это все теория
Если невыровнен, может
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Vlad Serebrennikov
For example, on ARM, there is LDRD instruction, which needs aligned memory address.
А на 86 этого требует часть вееторных операций
источник

A

ALEXX in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А если включить
Понимаете, все эти рассуждения на тему "оно, конечно, UB, но на практике ничего страшного не будет" исходят из предположения, что компилятор сгенерирует примерно тот код, что вы и ожидаете, а дальше что-то может пойти не так уже из-за этого кода - либо он приведёт к segfault, либо к нарушению выравнивания, и т.д.
Но оптимизатор это такая штука, которая очень любит менять ваш код, если это не меняет наблюдаемого поведения, и если ему кажется, что замена позволяет получить какой-то выигрыш.
Например, здесь:
void f(int *p) {
   if(!p) return;
   if(p)
       g();
   else
       h();
}

Вторая проверка и вызов h будут выкинуты, потому что это не меняет наблюдаемого поведения - оптимизатор точно знает, что строка с вызовом h просто никогда не сможет выполниться. И точно так же он может (будет) поступать, если встретит код, которого не должно быть, ибо по стандарту этот код вызывает UB - он посчитает, что по каким-то причинам до исполнения этого кода дело просто не дойдёт. А если всё таки дойдёт, то оптимизатору абсолютно фиолетово, что получится - на то оно и UB, и погромист ССЗБ. Что именно случится из-за выкидывания кода, и какие ещё выводы сделает оптимизатор для остального кода, при условии, что ветка с UB выкинута - угадать невозможно, вплоть до схлопывания всей программы в один ret.
источник

d

disba1ancer in pro.cxx
Artöm Bakri Al-Sarmini
А на 86 этого требует часть вееторных операций
в принципе можно даже ось написать так чтобы по невыровненым адресам нельзя было обращаться на x86
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
magras
Формально только с C++20.
А фактически работало всегда и работать не перестанет
источник

d

disba1ancer in pro.cxx
ибо пришло из сей...
источник

DP

Denis Paukaev in pro.cxx
disba1ancer
в принципе можно даже ось написать так чтобы по невыровненым адресам нельзя было обращаться на x86
вроде нет) обычные l/s инструкции спокойно живут на сколько я знаю, там проблемы у всяких SSE и прочего
источник

P

Pepe 🐸 in pro.cxx
круто, спасибо. По моему только оно работает (в смысле демонстрирует что значение не перезагружается) даже если убрать функцию бар и просто каст в foo поставить?
источник

d

disba1ancer in pro.cxx
Denis Paukaev
вроде нет) обычные l/s инструкции спокойно живут на сколько я знаю, там проблемы у всяких SSE и прочего
там можно включить специальное исключение при нарушении выравнивания
источник

P

Pepe 🐸 in pro.cxx
Pepe 🐸
круто, спасибо. По моему только оно работает (в смысле демонстрирует что значение не перезагружается) даже если убрать функцию бар и просто каст в foo поставить?
насколько я попробовал
источник

m

magras in pro.cxx
Pepe 🐸
круто, спасибо. По моему только оно работает (в смысле демонстрирует что значение не перезагружается) даже если убрать функцию бар и просто каст в foo поставить?
Проблема в том, что это не ваш случай. Для unsigned char которым скорее всего будет uint8_t это никогда не сработает. Это мы немного отвлеклись обсуждая мой неудачный пример, который был связан еще с одной проблемой, проявление которой можно продемонстрировать в отличие от нарушения правил лайфтайма. Ну и я думаю, что @das_3sz3tt прав и найти пример демонстрирующий проблему в вашем случае невозможно.
источник

P

Pepe 🐸 in pro.cxx
ок спасибо
источник
2020 July 09

DS

Dmitry Sokolov in pro.cxx
magras
Я тоже подумал об этом, но в такой ситуации уже лучше написать форматтер для оригинального типа (std::optional<int>).
Вообще это могло бы быть удобно и не для variant аргументов, например в случае enum вместо конверсий to_string/to_int в аргументах просто определить шаблонный маппинг в string_view или в underlying type.
источник

a

albert(); in pro.cxx
Всем привет
источник

JP

Jel Perzik in pro.cxx
привет
источник

RP

Roman Popov in pro.cxx
Подскажите, где сейчас лежит компилятор с наиболее актуальной реализацией static reflection и метаклассов?
источник

RP

Roman Popov in pro.cxx
Roman Popov
Подскажите, где сейчас лежит компилятор с наиболее актуальной реализацией static reflection и метаклассов?
Погуглил, похоже что здесь https://gitlab.com/lock3/clang
источник

/

/dev/desider in pro.cxx
Здравствуйте, как пропатчить Nvidia Cuda 11 под gcc 10?
источник

AZ

Alexander Zaitsev in pro.cxx
/dev/desider
Здравствуйте, как пропатчить Nvidia Cuda 11 под gcc 10?
так там же nvcc нужен
источник