Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

int[][] или int[] - что быстрее? - C++

09.08.2013, 04:17. Просмотров 671. Ответов 9
Метки нет (Все метки)

Везде вижу, что лучше использовать одномернный массив, а не двумерный. Всегда принимал это на правду, но сейчас задумался. Нужели умножение и сложение в 1-ой строке быстрее, чем разыменование + ещё одна адресация во второй:
C++
1
2
mas1[i * n + j] = 10; // 1
mas2[i][j] = 10; // 2
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2013, 04:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос int[][] или int[] - что быстрее? (C++):

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? - C++
Не понимаю, с чего начинать. Заранее спс.

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

GetRandomInt( int min, int max ) или Генерация случайных чисел - C++
Это программа, генерирующая случайное имя и приветствие. Но вот почему-то, случайность выпадения чисел одинаковая при каждом включении...

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5 #define col 5 using namespace...

Что означает эта строка? int _tmain(int argc, _TCHAR* argv[]) - C++
Всем привет, до этого пользовался DEV, решил пересесть на Visual Studio 2010 Express C++. С++ еще не изучал, хочу сначала добить &quot;С&quot;. ...

Что это такое int (*func4 (void)(int) - C++
Это примеры указателей на функцию. Понятно.void (*func1) (void *, int *); void (*func2) (int, int *); void (*func3) (void); А это что...

9
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
09.08.2013, 04:27 #2
nexen, если на стеке, то без разницы, двумерный массив - это всё равно один блок памяти. Другое дело когда выделяется в куче массив указателей, а потом ещё n массивов - выделить один кусок будет эффективнее.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
09.08.2013, 04:35  [ТС] #3
gray_fox, выделить - возможно, но обращаться к массиву всё же будет быстрее через [][]?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
09.08.2013, 04:42 #4
nexen, нет. Будет массив указателей + n массивов значений - всё эти массивы будут "раскиданы" в куче, как заблагорассудиться ОС. Разыменовав первый указатель, надо перейти по полученному адресу в другой блок памяти, потом ещё раз разыменовать. Имея одномерный массив, надо лишь посчитать сдвиг и разыменовать.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
09.08.2013, 05:04  [ТС] #5
gray_fox, ну так подсчет сдвига - умножение. А умножение гораздо медленее сложения. В итоге что имеем:
Первый подход: адресная арифметика (переход по адресу), разыменование (берем адрес по адресу), адресная арифметика (переход по адресу), разыменование (забираем значение)
Второй подход: умножение, сумма, адресная арифметика, разыменование.
Точно ли умножение и сумма выиграют разыменование и адресную арифметику и, если да, выходит, что разыменование крайне дорогая операция?..
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
09.08.2013, 05:15 #6
nexen, да вся эта математика выполняется мнгновенно, а вот то, что данные не локальны уже хуже, думаю, кэшу это не понравится (здесь я уже не особо разбираюсь). Считать, сколько тактов уйдёт на +, * и пр. по мне так занятие бессполезное.
1
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
09.08.2013, 05:18 #7
Просто мнение: оптимизируете не то. В любом случае доступ к элементу массива осуществляется за константное время.
В случае динамического выделения памяти проще один раз определить функцию доступа к элементам и выделять память одним куском, если возможно. Тупо потому что выделений памяти будет меньше, а это уже всяко более дорогая операция, чем доступ к элементу. С другой стороны, не стоит забывать о фрагментации памяти: теоретически в системе может не быть достаточно большого непрерывного фрагмента памяти. Сам, правда, на такое особо не напарывался - не приходилось работать с таким.
1
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 750
09.08.2013, 15:18 #8
обострение у вас, ребята, какое-то...

Добавлено через 1 минуту
одни неделю пытаются задачу решить, сэкономив 2 символа, другие в поте лица размышляют, как лучше массив объявить... успех...
0
alex1392
31 / 31 / 3
Регистрация: 24.07.2013
Сообщений: 187
09.08.2013, 15:21 #9
Цитата Сообщение от salam Посмотреть сообщение
обострение у вас, ребята, какое-то...

Добавлено через 1 минуту
одни неделю пытаются задачу решить, сэкономив 2 символа, другие в поте лица размышляют, как лучше массив объявить... успех...
Война фи-я главное маневры
0
NEbO
588 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 15:35 #10
если применяется в глубоко вложенном цикле (сталкивался например, при обработке изображений), используйте [], при последовательном чтении. При "[][]", вероятно (ну смотря какой у вас массив: в сишном компилятор поймет, и скомпилирует в тот же самый код, что и "[]"), потребуется два обращения к памяти, причем к разным блокам. Из-за этого при обращении на первом [] в кеш данных грузиться будет вся строка, а читаться только одно число. Вот это и есть неэффективное использование кеша (нужные строки могут удалиться).
Если цикл не сильно вложенный, то действительно задумываться об этом не стоит. Если же вам жизненно необходим эффективный и высокопроизводительный код, то о кеше забывать нельзя.
Прочтите http://habrahabr.ru/post/93263/ , там отличные примеры
1
09.08.2013, 15:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 15:35
Привет! Вот еще темы с ответами:

Что означает int pos = 0; int value = 5; в данном коде? - C++
#include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt; void mass(int y); void main() { int y;

[Linker Error] Unresolved external 'Sort(int near*near ,int, int) - C++
не могу понять в чем ошибка при компиляции ошибок не выдает при запуске программы - выдает эту ошибку Unresolved external 'Sort(int...

[Linker error] undefined reference to `sterling(int, int, int)' - C++
#include &lt;iostream&gt; using namespace std; int sterling(int,int,int); int sterling(int,int); int sterling(int); int main() { ...

int main() и int _tmain(int argc, _TCHAR* argv[]) - C++
При создании нового консольного приложения Microsoft Visual С++ 2010 Express создает начальный шаблон #include &quot;stdafx.h&quot; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru