Более высокий размерный массив по сравнению с эффективностью одномерного массива в C ++ - PullRequest
1 голос
/ 11 апреля 2011

Мне любопытно, как эффективно использовать массив более высокой размерности по сравнению с одномерной.Вы теряете что-нибудь, когда определяете и повторяете массив, как это:

array[i][j][k];

или определяете и повторяете массив, как это:

array[k + j*jmax + i*imax];

Я склоняюсь к тому, чтоРазница не будет, но я все еще учусь программированию с высокой эффективностью (мне никогда раньше не приходилось заботиться о подобных вещах).

Спасибо!

Ответы [ 5 ]

1 голос
/ 11 апреля 2011

Если вы можете переписать индексирование, то же самое можно сказать и о компиляторе. Я бы не волновался об этом.

Доверяйте своему компилятору (тм)!

1 голос
/ 11 апреля 2011

Первый способ и последний способ доступа к массивам идентичны после его компиляции. Имейте в виду, что доступ к областям памяти, которые находятся близко друг к другу, влияет на производительность, так как они будут кэшироваться по-разному. Таким образом, если вы храните многомерную матрицу, убедитесь, что вы храните строки одну за другой, если вы собираетесь обращаться к ним таким образом.

Как правило, кэши ЦП оптимизируются для временного и пространственного упорядочения. То есть, если вы обращаетесь к адресу памяти X, вероятность того, что вы получите доступ к X + 1, выше. Гораздо эффективнее работать со значениями в одной строке кэша.

Ознакомьтесь с этой статьей о кэшах ЦП для получения дополнительной информации о том, как различные политики хранения влияют на производительность: http://en.wikipedia.org/wiki/CPU_cache

1 голос
/ 11 апреля 2011

Единственный способ узнать наверняка - это сопоставить оба способа (разумеется, с флагами оптимизации в компиляторе). Во втором методе вы наверняка потеряете уверенность в ясности чтения.

0 голосов
/ 11 апреля 2011

Сделайте себе одолжение и позаботьтесь о таких вещах после профилирования кода . Маловероятно, что что-то подобное повлияет на производительность приложения в целом. Использование правильных алгоритмов гораздо важнее

И даже если это имеет значение, это, безусловно, только один внутренний цикл, который требует внимания.

0 голосов
/ 11 апреля 2011

Возможно, это зависит от реализации, но я бы сказал, что это более или менее равнозначно вашему коду для одномерного массива.

...