Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

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

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

Author24 — интернет-сервис помощи студентам
Что быстрее: mass[n] или *(mass+n) и стоит ли заморачиваться по этому поводу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 14:58
Ответы с готовыми решениями:

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

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

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

Run-Time Check Failure #2 - Stack around the variable 'mass' was corrupted
#include <iostream> #include <math.h> using namespace std; int main() { setlocale(LC_ALL,...

51
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 15:03 2
Одинаково. Нет.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
10.07.2012, 15:58 3
Есть мнение, что если *(mass+n) стоит в цикле и n - переменная цикла, то такой способ обращения несколько быстрее индексного (просто реализация быстрее).
0
70 / 64 / 5
Регистрация: 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
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
10.07.2012, 17:30 5
xADMIRALx, в таком случае зачем Вам i?
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.07.2012, 18:09 6
Цитата Сообщение от Ksan Посмотреть сообщение
mass[n] или *(mass+n)
эти записи одинаковы
Цитата Сообщение от Ksan Посмотреть сообщение
и стоит ли заморачиваться по этому поводу?
нет, не стоит
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.07.2012, 18:11 7
варианты одинаковы в том смысле, что будет сгенерирован один и тот же код на языке более низкого уровня (то асмовский или машинный)
1
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
10.07.2012, 18:14 8
знаю что оффтоп не всетаки
правда ли что mass[n] это синтаксический сахар?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.07.2012, 18:19 9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
правда ли что mass[n] это синтаксический сахар?
правда
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.07.2012, 20:20 10
Цитата Сообщение от Ksan Посмотреть сообщение
Что быстрее: mass[n] или *(mass+n)
С точки зрения результата эти записи одинаковы. Но, с точки зрения реализации они вполне могут отличаться(тут всё зависит компилятора и его настроек), при этом вторая запись не то что не будет работать быстрее, а скорее даже будет работать медленнее, чем первая(учитывая создание временной переменной). А вообще, никто вам не мешает запустить отладчик и проверить это самостоятельно
Цитата Сообщение от Ksan Посмотреть сообщение
стоит ли заморачиваться по этому поводу?
Нет
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2012, 20:31 11
C++
1
some_t mass[n];
Думаю что если тип some_t встроеный, то разницы нет.
Если же some_t пользовательский, то нужно смотреть на реализацию operator[](int index) ну и сам код.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 20:39 12
В варианте с оптимизациями обе записи дадут идентичный результат. Заморачиваться по поводу того, которую форму записи выбрать стОит, но только из соображений читабельности кода
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2012, 20:41 13
В варианте с оптимизациями обе записи дадут идентичный результат.
Я считал что оптимизатор может ничего не знать об пользовательском типе.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2012, 20:49 16
ForEveR, ну в принципе да.

-=ЮрА=- а если использовать пользователький тип?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 20:51 17
Avazart, Объясни мне в чем разница. Массив он и в африке массив. А вот если использовать пользовательский тип контейнера - это уже другой разговор.
0
Заблокирован
Автор FAQ
10.07.2012, 20:57 18
Avazart, я всё показал с асмом и прочим, для контейнеров(ты их подразумеваешь?) надо смотреть (я их вообще стараюсь кроме string не использовать - не вижу никаких преимуществ: в любом контейнере скорость доступа к элементу ниже чем скорость доступа к идентичному элементу в массиве того же размера. Так накой чёрт юзать чьи-то там писанные алгоритмы, если я и сам себе контейнер при желании с на много шире функционалом напишу). Пусть ТС уточнит что он рассматривает - контейнеры с итераторами или банальные массивы.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 20:58 19
-=ЮрА=-,
в любом контейнере скорость доступа к элементу ниже чем скорость доступа к идентичному элементу в массиве того же размера.
Не соглашусь. Если нету проверки на индекс, если итераторы реализованы через указатель, если включены оптимизации - скорость будет одинаковой.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.07.2012, 20:59 20
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Объясни мне в чем разница. Массив он и в африке массив. А вот если использовать пользовательский тип контейнера - это уже другой разговор.
ну при желании кто-нибудь для класса может перегрузить
operator[](int)
operator+(int)
operator*()

но тут уже нет вопроса быстродействия - здесь будут совершенно разные методы/функции вызываться
0
10.07.2012, 20:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 20:59
Помогаю со студенческими работами здесь

Программа выдает ошибку при выводе структуры в функции Vyvod(int N, struct vehicle*mass)
#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstdlib&gt; #include&lt;fstream&gt; #include &lt;iomanip&gt; ...

Undefined reference to Mass::~Mass
Здравствуйте, совсем уже отчаялся... Помогите пожалуйста исправить данную ошибку. Выдает её в 24...

Записать данные из dataGridView1 в массив mass
нужно записать данные из dataGridView1 в массив mass. при нажатии на кнопку выдает...

Создайте одномерный массив C(mass3), который содержит элементы,присутствующие в обоих массивах A(mass) и B(mass2)
Создайте одномерный массив C(mass3), который содержит элементы,присутствующие в обоих массивах...

USB Mass Storage или новые траблы с USB
Итак проблема такого рода включая компьютер все идет по стандарту до момента прогрузки материнской...

Mass storage class
Продолжение этой темы. Я не использую SD карту, поэтому меняю код файла usbd_storage.c следующим...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru