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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

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

10.07.2012, 14:58. Просмотров 2092. Ответов 51
Метки нет (Все метки)

Что быстрее: mass[n] или *(mass+n) и стоит ли заморачиваться по этому поводу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2012, 14:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив: Что быстрее: mass[n] или *(mass+n)? (C++):

динамичекий двумерный мас type *mass - C++
здрасти товарищи кодеры, нужны вашы знания в созданиях двумерного массива, но есть условие, создавать не как обычно type **mass ,а...

Что быстрее использовать, массив э-в, или указатель на массив э-в? - C++
уважаемые, что быстрее использовать, массив э-в, или указатель на массив э-в? или без разницы? С одной стороны обращается все к той же...

Что быстрее массив или файл - C++
Привет! Я тут занялся обработкой содержимого текстовых файлов для этого пишу класс отслеживающий положение курсора в файле (типа номер...

Программа выдает ошибку при выводе структуры в функции Vyvod(int N, struct vehicle*mass) - C++
#include<iostream> #include<cstdio> #include<cstdlib> #include<fstream> #include <iomanip> using namespace std; struct...

Что быстрее: i++ или ++i ? - C++
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...

Что быстрее assembler или c++ - C++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1) сложить a+b на C++ или на assembler 2) умножить a*b на C++...

51
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 15:03 #2
Одинаково. Нет.
0
Catstail
Модератор
22723 / 11092 / 1796
Регистрация: 12.02.2012
Сообщений: 18,285
10.07.2012, 15:58 #3
Есть мнение, что если *(mass+n) стоит в цикле и n - переменная цикла, то такой способ обращения несколько быстрее индексного (просто реализация быстрее).
0
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
10.07.2012, 16:20 #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;
}
то быстрее не ?
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 17:30 #5
xADMIRALx, в таком случае зачем Вам i?
1
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.07.2012, 18:09 #6
Цитата Сообщение от Ksan Посмотреть сообщение
mass[n] или *(mass+n)
эти записи одинаковы
Цитата Сообщение от Ksan Посмотреть сообщение
и стоит ли заморачиваться по этому поводу?
нет, не стоит
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.07.2012, 18:11 #7
варианты одинаковы в том смысле, что будет сгенерирован один и тот же код на языке более низкого уровня (то асмовский или машинный)
1
dr.curse
389 / 345 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:14 #8
знаю что оффтоп не всетаки
правда ли что mass[n] это синтаксический сахар?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.07.2012, 18:19 #9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
правда ли что mass[n] это синтаксический сахар?
правда
1
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
10.07.2012, 20:20 #10
Цитата Сообщение от Ksan Посмотреть сообщение
Что быстрее: mass[n] или *(mass+n)
С точки зрения результата эти записи одинаковы. Но, с точки зрения реализации они вполне могут отличаться(тут всё зависит компилятора и его настроек), при этом вторая запись не то что не будет работать быстрее, а скорее даже будет работать медленнее, чем первая(учитывая создание временной переменной). А вообще, никто вам не мешает запустить отладчик и проверить это самостоятельно
Цитата Сообщение от Ksan Посмотреть сообщение
стоит ли заморачиваться по этому поводу?
Нет
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
10.07.2012, 20:31 #11
C++
1
some_t mass[n];
Думаю что если тип some_t встроеный, то разницы нет.
Если же some_t пользовательский, то нужно смотреть на реализацию operator[](int index) ну и сам код.
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,206
Записей в блоге: 27
10.07.2012, 20:39 #12
В варианте с оптимизациями обе записи дадут идентичный результат. Заморачиваться по поводу того, которую форму записи выбрать стОит, но только из соображений читабельности кода
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
10.07.2012, 20:41 #13
В варианте с оптимизациями обе записи дадут идентичный результат.
Я считал что оптимизатор может ничего не знать об пользовательском типе.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
10.07.2012, 20:47 #14
Avazart, Если тип пользовательский, то массив то все равно обыкновенный, следовательно не нужно смотреть на реализацию [] (более того ее скорее всего просто не будет в пользовательском классе).
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.07.2012, 20:47 #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:   }
Индексация разная - асм один и тотже. Резюме: Оба варианта индексации идентичны в плане быстродействия, т.к. идентичны асмы для какждого варинта индексации.
1
10.07.2012, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 20:47
Привет! Вот еще темы с ответами:

Что быстрее списки или вектор ? - C++
Всем привет. Делаю приложение и очень важна скорость обработки данных, а нужно хранить динамические массивы. В каком формате будет...

If или switch().case. Что быстрее - C++
Есть два кода. Первый: if(a == 2) a += 2; if(a == 3) a+= 3; if(a == 4) a+=4; Второй:

Деление с остатком или маска, что быстрее? - C++
Всем известно, что побитовый сдвиг (&lt;&lt;, &gt;&gt;) выполняется быстрее деления на два. Деление целых на 2 через битовый сдвиг - архаизм? и...

Что быстрее - двоичный или текстовый файл? - C++
Встал вопрос о времени чтения данных с диска, посему нужно выбрать быстрейший из этих двух способов хранения данных на внешнем носителе. ...


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

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

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