Size: a a a

2021 March 15

АК

Александр Караев... in pro.cxx
Anatoly Shirokov
Многомерный массив занимает линейную память. Получая указатель на эту линейную память обращение к любому элементу не содержит UB в пределах N×M, включая элемент следующий за последним
Уже обсудили выше, что нет. Самый простой пруф - https://t.me/ProCxx/434779
источник

AS

Anatoly Shirokov in pro.cxx
Александр Караев
Уже обсудили выше, что нет. Самый простой пруф - https://t.me/ProCxx/434779
Тогда это противоречит определению массива в самом стандарте.
источник

O

Ofee in pro.cxx
Anatoly Shirokov
Это где об этом написано?
Думаю, в таком случае, стоит перечитать весь диалог, с рассуждений на эту тему он и начался. Никто не спорит с тем, что массив расположен линейно. Однако, пользуясь тем, что арифметка указателей не определена за пределами (под)массива, компилятор теоритически мог бы делать некоторые эвристические оптимизации на основе знания о том, что некоторые строки (все, кроме первой) недостижимы из программы
источник

AS

Anatoly Shirokov in pro.cxx
Ofee
Думаю, в таком случае, стоит перечитать весь диалог, с рассуждений на эту тему он и начался. Никто не спорит с тем, что массив расположен линейно. Однако, пользуясь тем, что арифметка указателей не определена за пределами (под)массива, компилятор теоритически мог бы делать некоторые эвристические оптимизации на основе знания о том, что некоторые строки (все, кроме первой) недостижимы из программы
ладно, пошел досыпать
источник

AS

Anatoly Shirokov in pro.cxx
Anton
этого тоже не написано
Это есть в определении массива
источник

A

Anton in pro.cxx
Anatoly Shirokov
Это есть в определении массива
есть массив, есть многомерный массив - это не одно и тоже
источник

AS

Anatoly Shirokov in pro.cxx
Anton
есть массив, есть многомерный массив - это не одно и тоже
мномерный определяется через массив
источник

AG

Andrey Glebov in pro.cxx
ещё в некоторых ситуациях он может доказать, что i <= N, и начать выкидывать код, приводящий к значениям i, большим чем N
источник

O

Ofee in pro.cxx
Mikhail Kalugin
В общем, я вижу ровно два случая (с нашим двухмерным массивом) либо декей до указателя, либо срез сокращением размерности. В первом случае компилятор не может делать никаких предположений о том что происходит - во втором, может смело выкинуть часть массива, но в коде ни что не пострадает, потому что в первом случае стандарт говорит a) существует кусок памяти, соответствующий всему массиву и б) существует указатель на первый элемент массива. Архитектура гарантирует,  что указатель может пройти по всей физически доступной памяти (и тут канонический отстрел ноги из C, но это другая история), во втором - стандарт говорит, что мы получим массив с размером равным втрой размерности и это его границы, выходить за них уже UB.
Дело в том, что декей двумерного массива интов не работает до указателя на инт. Только до указателя на массив интов. Это предел гарантий стандарта
источник

BU

Boris Usievich in pro.cxx
Ofee
Дело в том, что декей двумерного массива интов не работает до указателя на инт. Только до указателя на массив интов. Это предел гарантий стандарта
Речь изначально шла о том, можно ли руками привести указатель к обычному T* и работать с ним как с одномерным массивом. В случае constexpr ручное приведение просто запрещено
источник

A

Anton in pro.cxx
Boris Usievich
Речь изначально шла о том, можно ли руками привести указатель к обычному T* и работать с ним как с одномерным массивом. В случае constexpr ручное приведение просто запрещено
если, как написано в примере, многомерный массив - это массив массивов, то нет, а если это неопределенный многомерный массив, то неизвестно
источник

O

Ofee in pro.cxx
Boris Usievich
Речь изначально шла о том, можно ли руками привести указатель к обычному T* и работать с ним как с одномерным массивом. В случае constexpr ручное приведение просто запрещено
Ну, всё верно. Можно работать в пределах первой строки хоть в consteval, хоть в рантайме, но дальше – нельзя, ни там, ни там, поскольку мы выходим за рамки определённой стандартом арифметики указателей на элементы массивов
источник

BU

Boris Usievich in pro.cxx
Мне казалось, что гарантии размещения элементов многомерного массива подряд достаточно, но ....
источник

O

Ofee in pro.cxx
Boris Usievich
Мне казалось, что гарантии размещения элементов многомерного массива подряд достаточно, но ....
Если стековая переменная (или строка массива) гарантированно не используется нигде – почему бы её не выбросить оптимизатору?
источник

MK

Mikhail Kalugin in pro.cxx
Ofee
Дело в том, что декей двумерного массива интов не работает до указателя на инт. Только до указателя на массив интов. Это предел гарантий стандарта
Нет там такого. Предел - указатель на первый элемент. Первый элемент первого массива в случае многомерных. И тут важным момент - указатель на сырую память, занимаемую всем массивом. Действуют правила C, а не C++, либо это указатель на первый массив. int arr[n][m]; void f(int *p, int n, int m); // Суровый мир C void f(int a[m]); // Срез размерности и вызов не f(arr[i]); порча памяти.
источник

BU

Boris Usievich in pro.cxx
например потому, что если берется адрес массива, то кто-то может захотеть его использовать?
источник

O

Ofee in pro.cxx
Boris Usievich
например потому, что если берется адрес массива, то кто-то может захотеть его использовать?
Я намеренно использовал слово "гарантированно". Так что, если адрес массива не берётся?
источник

BU

Boris Usievich in pro.cxx
Ofee
Я намеренно использовал слово "гарантированно". Так что, если адрес массива не берётся?
Если адрес не берется, то у нас нет исходной проблемы, она возникает только когда адрес берется
источник

O

Ofee in pro.cxx
Mikhail Kalugin
Нет там такого. Предел - указатель на первый элемент. Первый элемент первого массива в случае многомерных. И тут важным момент - указатель на сырую память, занимаемую всем массивом. Действуют правила C, а не C++, либо это указатель на первый массив. int arr[n][m]; void f(int *p, int n, int m); // Суровый мир C void f(int a[m]); // Срез размерности и вызов не f(arr[i]); порча памяти.
А вы сможете доказать, что правила C здесь не перекрыты вышеуказанным пунктом стандарта и, более того, что эти правила действительно позволяют итерироваться по массиву? В таком случае, они однозначно заслуживают внимание, однако никто пока ещё не смог привести этих правил
источник

O

Ofee in pro.cxx
Boris Usievich
Если адрес не берется, то у нас нет исходной проблемы, она возникает только когда адрес берется
Нет, возникает, поскольку массивы могут состоять из других массивов. И на некоторые из них берется указатель, а некоторые из них гарантированно не используются
источник