Size: a a a

2021 March 14

АК

Александр Караев... in pro.cxx
Mikhail Kalugin
constexpr же...
И это лучшее доказательство, что код содержит UB
источник

MK

Mikhail Kalugin in pro.cxx
Александр Караев
И это лучшее доказательство, что код содержит UB
Это доказательство только того что память под пустой массив не выделяется на этапа компиляции.
источник

O

Ofee in pro.cxx
Mikhail Kalugin
Здравый смысл и ручное управление памятью - компилятор не должен принимать решения на основе того, что кто-то делает с указателями.
Я тоже придерживаюсь мнения, что если программист явно определил массив определенного размера – попытки что-либо здесь оптимизировать абсурдны, поскольку вступают в противоречие со здравым смыслом

Однако, если мы каждый раз будем полагаться на здравый смысл и желание чем бы то ни было управлять вручную – мы очень быстро придём к тому, что всю работу оптимизатора мы взвалим на программиста, а это несколько далековато от того, для чего вообще сейчас нужен C++
источник

АК

Александр Караев... in pro.cxx
Mikhail Kalugin
Это доказательство только того что память под пустой массив не выделяется на этапа компиляции.
Это доказательство того, что доступ (&a[0][0])[2] - UB
источник

MK

Mikhail Kalugin in pro.cxx
Александр Караев
Это доказательство того, что доступ (&a[0][0])[2] - UB
Ну да, в контексте constexpr.
источник

LA

Liber Azerate in pro.cxx
Mikhail Kalugin
Ну да, в контексте constexpr.
А почему? Потому что UB
источник

AG

Andrey Glebov in pro.cxx
Но нет же отдельно UB для constexpr и для runtime. Есть просто UB :)
источник

MK

Mikhail Kalugin in pro.cxx
Ofee
Я тоже придерживаюсь мнения, что если программист явно определил массив определенного размера – попытки что-либо здесь оптимизировать абсурдны, поскольку вступают в противоречие со здравым смыслом

Однако, если мы каждый раз будем полагаться на здравый смысл и желание чем бы то ни было управлять вручную – мы очень быстро придём к тому, что всю работу оптимизатора мы взвалим на программиста, а это несколько далековато от того, для чего вообще сейчас нужен C++
Не в этом случае - иначе необходима автоматическая сборка мусора.
источник

LA

Liber Azerate in pro.cxx
Andrey Glebov
Но нет же отдельно UB для constexpr и для runtime. Есть просто UB :)
Да, просто UB запрещены в constexpr-контексте. Я уже кидал конкретный пункт стандарта
источник

MK

Mikhail Kalugin in pro.cxx
Andrey Glebov
Но нет же отдельно UB для constexpr и для runtime. Есть просто UB :)
Но что именно UB. Судя по всему тут попытка использовать математику указателей до того как память выделена.
источник

O

Ofee in pro.cxx
Mikhail Kalugin
Не в этом случае - иначе необходима автоматическая сборка мусора.
Я думаю, что обсуждаемая тема не имеет отношения к сборке мусора или даже управлению памятью
источник

LA

Liber Azerate in pro.cxx
Mikhail Kalugin
Но что именно UB. Судя по всему тут попытка использовать математику указателей до того как память выделена.
А это указано как уб в стандарте?
источник

АК

Александр Караев... in pro.cxx
Mikhail Kalugin
Ну да, в контексте constexpr.
constexpr лишь доказывает, что UB есть. Сам UB в рантайме никуда не уйдет.
источник

AG

Andrey Glebov in pro.cxx
Mikhail Kalugin
Но что именно UB. Судя по всему тут попытка использовать математику указателей до того как память выделена.
Тут UB состоит в попытке использовать указатель для доступа за границу массива, в который он указывает.
источник

LA

Liber Azerate in pro.cxx
Andrey Glebov
Тут UB состоит в попытке использовать указатель для доступа за границу массива, в который он указывает.
Найдите соответствующий пункт стандарта, указывающий, что это UB
источник

VS

Vlad Serebrennikov in pro.cxx
Andrey Glebov
Тут UB состоит в попытке использовать указатель для доступа за границу массива, в который он указывает.
ошибка компилятора ни о каком использовании не гласит, правда
источник

MK

Mikhail Kalugin in pro.cxx
Ofee
Я думаю, что обсуждаемая тема не имеет отношения к сборке мусора или даже управлению памятью
Вообще то имеет. Речь об эвристических оптимизациях на основе использования памяти через указатели в обход правил управления памятью определенных стандартом.
источник

O

Ofee in pro.cxx
Mikhail Kalugin
Но что именно UB. Судя по всему тут попытка использовать математику указателей до того как память выделена.
Арифметика указателей не определена стандартом в случае выхода за пределы массива
int arr[2][2];
int * p = &arr[0][3];

Компилятор имеет право заключить, что p == nullptr. Например, в целях отладки
источник

AG

Andrey Glebov in pro.cxx
Liber Azerate
Найдите соответствующий пункт стандарта, указывающий, что это UB
https://eel.is/c++draft/dcl.array#9 определяет, что "многомерный массив" - это массив массивов
https://eel.is/c++draft/expr.add#4.3 говорит, что арифметика указателей за границами исходного массива не определена (не говоря о разыменовании)
источник

LA

Liber Azerate in pro.cxx
Andrey Glebov
https://eel.is/c++draft/dcl.array#9 определяет, что "многомерный массив" - это массив массивов
https://eel.is/c++draft/expr.add#4.3 говорит, что арифметика указателей за границами исходного массива не определена (не говоря о разыменовании)
Ну замечательно. То есть мы и доказали, что ходить по многомерному массиву как по одномерному нельзя
источник