Size: a a a

2021 March 14

BU

Boris Usievich in pro.cxx
Nick Shalimov
Может потому, что memset здесь не особо лучше сработает? Профилировать нужно, причëм лучше на целевой платформе
memset заведомо на любой платформе не хуже.
источник

AG

Andrey Glebov in pro.cxx
Quickbench говорит что второй вариант в clang в 270 раз хуже (asm такой же, как на CE)
Но в любом случае получается, что компилятор не распознал эквивалентность циклов, иначе оба были бы соптимизированы одинаково.
источник

NS

Nick Shalimov in pro.cxx
Ну что же, плохо для оптимизатора)
источник

m

magras in pro.cxx
Эта оптимизация возможна только если есть статический двухмерный массив и компилятор уверен что все подмассивы будут разложены в памяти последовательно. Если волнует производительность использовать двумерные массивы вообще звучит как очень плохая идея.
источник

m

magras in pro.cxx
Стоп, а такая оптимизация вообще законна? Я же могу добавить функцию, которая например сделает arr[0] = new char[N];. После этого предложенная выше оптимизация сломается.
источник

AG

Andrey Glebov in pro.cxx
<source>:36:24: error: incompatible types in assignment of 'char*' to 'char [4096]'
  36 |     arr[0] = new char[N];
источник

AG

Andrey Glebov in pro.cxx
это же не массив указателей на массивы
источник

AG

Andrey Glebov in pro.cxx
magras
Эта оптимизация возможна только если есть статический двухмерный массив и компилятор уверен что все подмассивы будут разложены в памяти последовательно. Если волнует производительность использовать двумерные массивы вообще звучит как очень плохая идея.
В общем случае, конечно, да + в реальном коде я бы не использовал сишние массивы)
Но пример не мой, да и в этом конкретном случае как раз статический массив.
К тому же, судя по оптимизации первой функции, подмассивы лежат последовательно, или я что-то недосмотрел?
источник

ЕП

Евгений Попов... in pro.cxx
Ага, цикл в цикле
источник

ЕП

Евгений Попов... in pro.cxx
Эта оптимизация возможна только если есть статический двухмерный массив и компилятор уверен что все подмассивы будут разложены в памяти последовательно. Если волнует производительность использовать двумерные массивы вообще звучит как очень плохая идея.
источник

m

magras in pro.cxx
Andrey Glebov
это же не массив указателей на массивы
хм. Действительно, даже
char t[N];
void foo() {
 arr[0] = t;
}

не компилируется. Еще одна дырка в моем образовании. =)
источник

AG

Andrey Glebov in pro.cxx
и да, в Стандарте указан даже конкретный layout для такого массива
https://stackoverflow.com/a/12880160/4567486
источник

BU

Boris Usievich in pro.cxx
Причем тут статичность массива? Важно только то, что это двумерный массив. Что функция f3 в примере выше прекрасно демонстрирует. Можно в нее  передать что-то выделенное динамически. А что касается производительности, то всякие стандартные функции из BLAS хотят на вход именно двумерные массивы :)
источник

m

magras in pro.cxx
Да, извиняюсь. Я считал что двухмерные массивы это всегда массив указателей на подмассивы.
источник

BU

Boris Usievich in pro.cxx
К счастью нет, иначе действительно было бы медленно
источник

m

magras in pro.cxx
Boris Usievich
Причем тут статичность массива? Важно только то, что это двумерный массив. Что функция f3 в примере выше прекрасно демонстрирует. Можно в нее  передать что-то выделенное динамически. А что касается производительности, то всякие стандартные функции из BLAS хотят на вход именно двумерные массивы :)
м... На счет BLAS. Это же будет работать только для матриц с фиксированным размером (хотя бы одним). Я blas'ом пользовался только через врапперы. Да, я помню что эти вапперы обрабатывали некоторые слачаи небольшой размерности отдельно, но в общем случае размер же динамический.
источник

BU

Boris Usievich in pro.cxx
magras
м... На счет BLAS. Это же будет работать только для матриц с фиксированным размером (хотя бы одним). Я blas'ом пользовался только через врапперы. Да, я помню что эти вапперы обрабатывали некоторые слачаи небольшой размерности отдельно, но в общем случае размер же динамический.
Ну там же размеры передаются при вызове и указатель на начало массива.
источник

m

magras in pro.cxx
Boris Usievich
Ну там же размеры передаются при вызове и указатель на начало массива.
Звучит правдоподобно. Но в этом случае обычно используются как раз одномерные массивы.
источник

BU

Boris Usievich in pro.cxx
Это все идет еще из фортрана, через C, в С++. многомерные массивы лежат в памяти подряд, что позволяет с ними работать как с одномерными при желании.
источник

m

magras in pro.cxx
Boris Usievich
Это все идет еще из фортрана, через C, в С++. многомерные массивы лежат в памяти подряд, что позволяет с ними работать как с одномерными при желании.
Ну в плюсах просто невозможно работать с "плоским" двухмерным массивом произвольной размерности. Поэтому используют одномерные.
источник