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

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

10.07.2012, 14:58. Показов 6642. Ответов 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
-=ЮрА=-
10.07.2012, 21:00     Массив: Что быстрее: mass[n] или *(mass+n)?
  #21

Не по теме:

PS:Avazart, а если писать на С++ или паскале где быстрей будет доступ, аесли в шарпе. а где быстрей вообще работает индексации на NT или UNIX, давай глобализируем задачу и уйдём в дебри:) Не заморачивай голову...

0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 21:03 22
Цитата Сообщение от Avazart Посмотреть сообщение
а если использовать пользователький тип?
Если ты имеешь в виду самодельную реализацию операторов, то программист всегда же может всё сделать через ж...у и оно будет заведомо не одинаковым

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Оба варианта индексации идентичны в плане быстродействия, т.к. идентичны асмы для какждого варинта индексации
"Т.к. идентичны асмы" - это следствие. А причина - "т.к. это следует из стандарта языка Си\Си++ и определения оператора []" (разумеется, без учёта возможной кривой перегрузки)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:03 23
alex_x_x, Ну, допустим, перегрузили, т.е.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct some
{
   int value;
};
 
some operator +(const some&, int)
{
    return some();
}
 
int main()
{
   some array[5];
   (*(array + 1)).value = 0;
}
массив ведь он и в африке массив, наши операторы вызваны не будут.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 21:04 24
Цитата Сообщение от ForEveR Посмотреть сообщение
массив ведь он и в африке массив, наши операторы вызваны не будут
А оператор можно перегрузить только для класса, ноне для указателя на класс?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:06 25
Evg, Один параметр точно должен быть объектом класса (значением, ссылкой), но не указателем.
http://liveworkspace.org/code/... 5c72126db3
0
Заблокирован
Автор FAQ
10.07.2012, 21:07 26
Цитата Сообщение от ForEveR Посмотреть сообщение
Не соглашусь. Если нету проверки на индекс, если итераторы реализованы через указатель, если включены оптимизации - скорость будет одинаковой.
- возможно я несколько некорректно выразился, т.е. если имеем класс
C++
1
2
3
4
5
6
7
8
9
class userType
{
private:
    char *str;
public:
    userType(char * _str){_str = str;}
    char Get(int index){return str[index];}
    char * Mem(){return str;};
};
То да скорость индексации будет одинаковой, но т.к. в реалии классы мы пишем сложнее а перегрузить оператор [] тоже надо то думаю код асма для самописного контейнера выйдет всё же подлинней. В любом случае для простых массивом скорости доступа одинаковы, как я уже писал.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 21:10 27
Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, Один параметр точно должен быть объектом класса (значением, ссылкой), но не указателем
В итоге получается, что при работе с массивом мы никогда не попадём ни в перегруженный оператор +, ни в перегруженный оператор []?
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
10.07.2012, 21:11 28
Ребят а через указатель доступ будит быстрее ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:12 29
Evg, С нативным массивом - да. Если класс контейнер, он уже не является массивом.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.07.2012, 21:15 30
Перегруженный оператор для объекта массива можно будет вызвать так:
some_class array[ 6 ];

array[ 6 ][ 0 ] = 1;
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:17 31
Toshkarik, Ну да, это-то понятно полагаю.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.07.2012, 21:20 32
Цитата Сообщение от ForEveR Посмотреть сообщение
массив ведь он и в африке массив, наши операторы вызваны не будут.
за счет перегрузки операторов они могут вызываться как угодно и с каким угодно смыслом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct some
{
   int value;
   some& operator [](int) { return *this; }
   some& operator+(int)   { return *this; }
   some& operator*()      { for (;;) ; return *this; }
};
 
int main()
{
   some sm;
   *(sm + 5);
    sm[5];
}
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.07.2012, 21:22 33
ForEveR, Ну я просто не понимаю обсуждения, массив на то и массив - его имя является константным указателем. При доступе по индексу разыменовывется указатель со смещением, и мы получаем объект ( не важно, встроенного типа или пользовательский класс ). И дальше уже применяем к нему доступные операции.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 21:23 34
alex_x_x, Да, НО тут нет объявления массива.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.07.2012, 21:23 35
alex_x_x, разговор идет про массивы объектов, а не про перегруженные операторы пользовательских классов.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.07.2012, 21:26 36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Индексация разная - асм один и тотже. Резюме: Оба варианта индексации идентичны в плане быстродействия, т.к. идентичны асмы для какждого варинта индексации.
gcc(без оптимизации)
C++
1
2
3
4
5
6
7
8
int main()
{
    int a[5];
    int b[5];
 
    a[1] = 1;
    *(b + 1) = 1;
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;---------------------
;    a[1] = 1;
;---------------------
 
; a[1] = 1;
movl    $0x1,-0x10(%ebp)
 
 
 
;---------------------
;    *(b + 1) = 1;
;---------------------
 
; временная перменная (b + 1)
lea     -0x28(%ebp), %eax 
add     $0x4, %eax             
 
; *(b + 1) = 1;
movl    $0x1, (%eax)
как я и сказал, всё зависит от компилятора и его настроек.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 21:29 37
Цитата Сообщение от rangerx Посмотреть сообщение
gcc(без оптимизации)
А какая версия?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 21:34 38
Цитата Сообщение от rangerx Посмотреть сообщение
как я и сказал, всё зависит от компилятора и его настроек
Варианты без оптимизация вообще не имеет смысла сравнивать, когда речь идёт о том, какая конструкция быстрее. Включи хотя бы уровень -O1 и будет всё одинаково. На любом вменяемом компиляторе
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
10.07.2012, 21:44 39
Ребят ну вы так и не ответили,не ужели через указатель не быстрее ?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2012, 21:47 40
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Ребят ну вы так и не ответили,не ужели через указатель не быстрее ?
Ответили же, что разницы никакой
1
10.07.2012, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 21:47
Помогаю со студенческими работами здесь

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

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 следующим...


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

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