Форум программистов, компьютерный форум CyberForum.ru

Массив: Что быстрее: mass[n] или *(mass+n)? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 14:58     Массив: Что быстрее: mass[n] или *(mass+n)? #1
Что быстрее: mass[n] или *(mass+n) и стоит ли заморачиваться по этому поводу?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 15:03     Массив: Что быстрее: mass[n] или *(mass+n)? #2
Одинаково. Нет.
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
10.07.2012, 15:58     Массив: Что быстрее: mass[n] или *(mass+n)? #3
Есть мнение, что если *(mass+n) стоит в цикле и n - переменная цикла, то такой способ обращения несколько быстрее индексного (просто реализация быстрее).
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
10.07.2012, 16:20     Массив: Что быстрее: mass[n] или *(mass+n)? #4
вроде ж если
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
int main()
{
 char mass[] = "cyberforum";
 char *p = mass;
     for (int i = 0; *p;++i,++p)
     cout << *p <<  " ";
 
return 0;
}
то быстрее не ?
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 17:30     Массив: Что быстрее: mass[n] или *(mass+n)? #5
xADMIRALx, в таком случае зачем Вам i?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.07.2012, 18:09     Массив: Что быстрее: mass[n] или *(mass+n)? #6
Цитата Сообщение от Ksan Посмотреть сообщение
mass[n] или *(mass+n)
эти записи одинаковы
Цитата Сообщение от Ksan Посмотреть сообщение
и стоит ли заморачиваться по этому поводу?
нет, не стоит
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.07.2012, 18:11     Массив: Что быстрее: mass[n] или *(mass+n)? #7
варианты одинаковы в том смысле, что будет сгенерирован один и тот же код на языке более низкого уровня (то асмовский или машинный)
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:14     Массив: Что быстрее: mass[n] или *(mass+n)? #8
знаю что оффтоп не всетаки
правда ли что mass[n] это синтаксический сахар?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.07.2012, 18:19     Массив: Что быстрее: mass[n] или *(mass+n)? #9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
правда ли что mass[n] это синтаксический сахар?
правда
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
10.07.2012, 20:20     Массив: Что быстрее: mass[n] или *(mass+n)? #10
Цитата Сообщение от Ksan Посмотреть сообщение
Что быстрее: mass[n] или *(mass+n)
С точки зрения результата эти записи одинаковы. Но, с точки зрения реализации они вполне могут отличаться(тут всё зависит компилятора и его настроек), при этом вторая запись не то что не будет работать быстрее, а скорее даже будет работать медленнее, чем первая(учитывая создание временной переменной). А вообще, никто вам не мешает запустить отладчик и проверить это самостоятельно
Цитата Сообщение от Ksan Посмотреть сообщение
стоит ли заморачиваться по этому поводу?
Нет
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
10.07.2012, 20:31     Массив: Что быстрее: mass[n] или *(mass+n)? #11
C++
1
some_t mass[n];
Думаю что если тип some_t встроеный, то разницы нет.
Если же some_t пользовательский, то нужно смотреть на реализацию operator[](int index) ну и сам код.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
10.07.2012, 20:39     Массив: Что быстрее: mass[n] или *(mass+n)? #12
В варианте с оптимизациями обе записи дадут идентичный результат. Заморачиваться по поводу того, которую форму записи выбрать стОит, но только из соображений читабельности кода
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
10.07.2012, 20:41     Массив: Что быстрее: mass[n] или *(mass+n)? #13
В варианте с оптимизациями обе записи дадут идентичный результат.
Я считал что оптимизатор может ничего не знать об пользовательском типе.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 20:47     Массив: Что быстрее: mass[n] или *(mass+n)? #14
Avazart, Если тип пользовательский, то массив то все равно обыкновенный, следовательно не нужно смотреть на реализацию [] (более того ее скорее всего просто не будет в пользовательском классе).
-=ЮрА=-
Заблокирован
Автор FAQ
10.07.2012, 20:47     Массив: Что быстрее: mass[n] или *(mass+n)? #15
Цитата Сообщение от Ksan Посмотреть сообщение
Что быстрее: mass[n] или *(mass+n) и стоит ли заморачиваться по этому поводу?
Поддерживаю alex_x_x.
Предлагаю рассмотреть код ниже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int fun1(char * str)
{
    int n = 0;
    while(*(str + n))
    {
        cout<<*(str + n);
        n = n + 1;
    }
    return n;
}
 
int fun2(char * str)
{
    int n = 0;
    while(str[n])
    {
        cout<<str[n];
        n = n + 1;
    }
    return n;
}
 
 
int main()
{
    char str[] = "blablabla";
    cout<<"fun1 ret len : "<<fun1(str)<<endl;
    cout<<"fun2 ret len : "<<fun2(str)<<endl;
    return 0;
}
Верней асмы fun1 и fun2

asm fun1
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
4:    int fun1(char * str)
5:    {
00401590   push        ebp
00401591   mov         ebp,esp
00401593   sub         esp,44h
00401596   push        ebx
00401597   push        esi
00401598   push        edi
00401599   lea         edi,[ebp-44h]
0040159C   mov         ecx,11h
004015A1   mov         eax,0CCCCCCCCh
004015A6   rep stos    dword ptr [edi]
6:        int n = 0;
004015A8   mov         dword ptr [ebp-4],0
7:        while(*(str + n))
004015AF   mov         eax,dword ptr [ebp+8]
004015B2   add         eax,dword ptr [ebp-4]
004015B5   movsx       ecx,byte ptr [eax]
004015B8   test        ecx,ecx
004015BA   je          fun1+4Dh (004015dd)
8:        {
9:            cout<<*(str + n);
004015BC   mov         edx,dword ptr [ebp+8]
004015BF   add         edx,dword ptr [ebp-4]
004015C2   mov         al,byte ptr [edx]
004015C4   push        eax
004015C5   push        offset std::cout (004777e0)
004015CA   call        @ILT+445(std::operator<<) (004011c2)
004015CF   add         esp,8
10:           n = n + 1;
004015D2   mov         ecx,dword ptr [ebp-4]
004015D5   add         ecx,1
004015D8   mov         dword ptr [ebp-4],ecx
11:       }
004015DB   jmp         fun1+1Fh (004015af)
12:       return n;
004015DD   mov         eax,dword ptr [ebp-4]
13:   }
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
15:   int fun2(char * str)
16:   {
00401610   push        ebp
00401611   mov         ebp,esp
00401613   sub         esp,44h
00401616   push        ebx
00401617   push        esi
00401618   push        edi
00401619   lea         edi,[ebp-44h]
0040161C   mov         ecx,11h
00401621   mov         eax,0CCCCCCCCh
00401626   rep stos    dword ptr [edi]
17:       int n = 0;
00401628   mov         dword ptr [ebp-4],0
18:       while(str[n])
0040162F   mov         eax,dword ptr [ebp+8]
00401632   add         eax,dword ptr [ebp-4]
00401635   movsx       ecx,byte ptr [eax]
00401638   test        ecx,ecx
0040163A   je          fun2+4Dh (0040165d)
19:       {
20:           cout<<str[n];
0040163C   mov         edx,dword ptr [ebp+8]
0040163F   add         edx,dword ptr [ebp-4]
00401642   mov         al,byte ptr [edx]
00401644   push        eax
00401645   push        offset std::cout (004777e0)
0040164A   call        @ILT+445(std::operator<<) (004011c2)
0040164F   add         esp,8
21:           n = n + 1;
00401652   mov         ecx,dword ptr [ebp-4]
00401655   add         ecx,1
00401658   mov         dword ptr [ebp-4],ecx
22:       }
0040165B   jmp         fun2+1Fh (0040162f)
23:       return n;
0040165D   mov         eax,dword ptr [ebp-4]
24:   }
Индексация разная - асм один и тотже. Резюме: Оба варианта индексации идентичны в плане быстродействия, т.к. идентичны асмы для какждого варинта индексации.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
10.07.2012, 20:49     Массив: Что быстрее: mass[n] или *(mass+n)? #16
ForEveR, ну в принципе да.

-=ЮрА=- а если использовать пользователький тип?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 20:51     Массив: Что быстрее: mass[n] или *(mass+n)? #17
Avazart, Объясни мне в чем разница. Массив он и в африке массив. А вот если использовать пользовательский тип контейнера - это уже другой разговор.
-=ЮрА=-
Заблокирован
Автор FAQ
10.07.2012, 20:57     Массив: Что быстрее: mass[n] или *(mass+n)? #18
Avazart, я всё показал с асмом и прочим, для контейнеров(ты их подразумеваешь?) надо смотреть (я их вообще стараюсь кроме string не использовать - не вижу никаких преимуществ: в любом контейнере скорость доступа к элементу ниже чем скорость доступа к идентичному элементу в массиве того же размера. Так накой чёрт юзать чьи-то там писанные алгоритмы, если я и сам себе контейнер при желании с на много шире функционалом напишу). Пусть ТС уточнит что он рассматривает - контейнеры с итераторами или банальные массивы.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 20:58     Массив: Что быстрее: mass[n] или *(mass+n)? #19
-=ЮрА=-,
в любом контейнере скорость доступа к элементу ниже чем скорость доступа к идентичному элементу в массиве того же размера.
Не соглашусь. Если нету проверки на индекс, если итераторы реализованы через указатель, если включены оптимизации - скорость будет одинаковой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 20:59     Массив: Что быстрее: mass[n] или *(mass+n)?
Еще ссылки по теме:

Что быстрее assembler или c++ C++
If или switch().case. Что быстрее C++
C++ Что быстрее: i++ или ++i ?

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.07.2012, 20:59     Массив: Что быстрее: mass[n] или *(mass+n)? #20
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Объясни мне в чем разница. Массив он и в африке массив. А вот если использовать пользовательский тип контейнера - это уже другой разговор.
ну при желании кто-нибудь для класса может перегрузить
operator[](int)
operator+(int)
operator*()

но тут уже нет вопроса быстродействия - здесь будут совершенно разные методы/функции вызываться
Yandex
Объявления
10.07.2012, 20:59     Массив: Что быстрее: mass[n] или *(mass+n)?
Ответ Создать тему
Опции темы

Текущее время: 19:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru