Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

Что быстрее: i++ или ++i ?

11.11.2014, 11:19. Просмотров 7363. Ответов 16
Метки нет (Все метки)


Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то относится ли это к не итераторам в том числе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2014, 11:19
Ответы с готовыми решениями:

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

Что быстрее: умножение или присваивание
Привет чтобы поменять знак у числа есть два способа. подскажите, который из них будет быстрее...

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

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

16
236 / 194 / 21
Регистрация: 04.06.2014
Сообщений: 1,313
11.11.2014, 11:21 2
Префиксный выполняется быстрее. Не знаю почему, но это так.
1
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2014, 11:27  [ТС] 3
SmittWesson, я тоже не знаю, но пишут, что не происходит вызов конструктора.
0
Эксперт С++
1919 / 1261 / 360
Регистрация: 16.05.2013
Сообщений: 3,293
Записей в блоге: 6
11.11.2014, 11:28 4
programina, как бы истина вполне известная. Постфиксный инкремент итератора возвращает предыдущее свое значение для чего используется временная переменная. Для префиксной формы этого не требуется. Собственно данный факт относится ко всем типам в С++ поддерживаеммым инкремент или декремент. Как пример для реверсных итераторов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
  reverse_iterator&
      operator++()
      {
    --current;
    return *this;
      }
 
      reverse_iterator
      operator++(int)
      {
    reverse_iterator __tmp = *this;
    --current;
    return __tmp;
      }
3
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.11.2014, 11:28 5
programina, по всей логикет префиксный должен быть быстрее, т.к там нет копирования исходного значения, но разница в производительности не ощутимая(даже не миллионе иттераций)
2
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2014, 11:38  [ТС] 6
А как с простыми типами типа int, float и др.?

Добавлено через 5 минут
C++
1
int i = 0;
C++
1
for(;; ++i); значит быстрее, чем for(;; i++);
?
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.11.2014, 11:38 7
programina, так же, т.е постфиксная во временную переменную сохраняет текущее значение, и оно возвращается по значению, префиксная изменяет переменную и возвращает константную ссылку
1
шКодер самоучка
2127 / 1843 / 902
Регистрация: 09.10.2013
Сообщений: 4,029
Записей в блоге: 7
11.11.2014, 11:39 8
C++
1
2
3
4
5
6
7
8
int pre(int* i) {
    if(++(*i) == 0) return 0;
    return *i;
}
int pos(int* i) {
    if((*i)++ == 0) return 0;
    return *i;
}
Bash
1
gcc -S -O3 pre_vs_pos.c
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
    .file   "pre_vs_pos.c"
    .text
; префикс
    .p2align 4,,15
    .globl  pre
    .def    pre;    .scl    2;  .type   32; .endef
    .seh_proc   pre
pre:
    .seh_endprologue
    movl    (%rcx), %eax
    addl    $1, %eax
    movl    %eax, (%rcx)
    ret
    .seh_endproc
; посфикс
    .p2align 4,,15
    .globl  pos
    .def    pos;    .scl    2;  .type   32; .endef
    .seh_proc   pos
pos:
    .seh_endprologue
    movl    (%rcx), %edx
    leal    1(%rdx), %eax
    testl   %edx, %edx
    movl    $0, %edx
    movl    %eax, (%rcx)
    cmove   %edx, %eax
    ret
    .seh_endproc
    .ident  "GCC: (rev5, Built by MinGW-W64 project) 4.8.1"
Как видим, ++i чуточку короче на ассемблере чем i++
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
11.11.2014, 11:39 9
programina. Зависит от компилятора и конкретного кода. Но в подавляющем большинстве случаев операции будут выполняться одинаково быстро.
2
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.11.2014, 11:40 10
Цитата Сообщение от Cra3y Посмотреть сообщение
Как видим, ++i чуточку короче на ассемблере чем i++
учитывая соверменные скорости это не повляет
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
11.11.2014, 11:43 11
Цитата Сообщение от aLarman Посмотреть сообщение
по всей логикет префиксный должен быть быстрее, т.к там нет копирования исходного значения, но разница в производительности не ощутимая
Я тоже так думаю. Для итерации ведь используются простые вещи, - целые либо итераторы/указатели. Но если угораздит перегрузить инкремент-декремент для какого-то объёмистого типа, то разница может быть видна, наверное. Кроме всего, учитывая, что и при целом типе переменная может стать регистровой, а может и не стать, разница может проявиться. С другой стороны, "умный" компилятор может и не создать временную, если она не нужна (скорее мечты наверное))? Как это зависит от архитектуры и компилятора и зависит ли не скажу. Не знаю.
1
aLarman
11.11.2014, 11:45
  #12

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
переменная может стать регистровой, а может и не стать
да уж навернякак станет регистровой :)

0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2014, 11:55  [ТС] 13
aLarman,
учитывая соверменные скорости это не повляет
Обьемы современные тоже надо учитывать, мало ли что, а если нужно сделать 10 000 000 операций

Добавлено через 54 секунды
Спасибо за ответы!
1
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
11.11.2014, 12:04 14
Ну я удивляюсь, что никто не вспомнил про самый глубоководный камень инкремента именно пользовательского типа. Когда уже компилятор ничего не оптимизирует и бла-бла-бла.
1
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
11.11.2014, 12:55 15

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
да уж наверняка станет регистровой
Это в том смысле, что если 64 разрядный регистр содержит 32 разрядное без знака, то он на половину полон? И тут согласен. :)



Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ну я удивляюсь, что никто не вспомнил про самый глубоководный камень инкремента именно пользовательского типа.
А это не про это:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но если угораздит перегрузить инкремент-декремент для какого-то объёмистого типа
?
1
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
11.11.2014, 13:13 16
Цитата Сообщение от Cra3y Посмотреть сообщение
addl $1, %eax
Компилятор розошолся.
0
Форумчанин
Эксперт CЭксперт С++
8164 / 5012 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
11.11.2014, 14:25 17
На самом деле, в теории префиксная запись быстрее т.к. возвращает ссылку, а не объект (не создаётся временная локальная копия), но всем современным компиляторам уже всё равно, они всё это дело оптимизируют, тем более для POD типов.
Для итераторов уже не всё так просто:
http://www.viva64.com/ru/b/0093/
http://silviuardelean.ro/2011/... -operator/
однако чаще всего, в релизе всё равно всё приводится к префиксной записи.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2014, 14:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

Деление с остатком или маска, что быстрее?
Всем известно, что побитовый сдвиг (<<, >>) выполняется быстрее деления на два. Деление целых на 2...

Что быстрее, операция присваивания или сравнения?
Всем доброго времени суток, такой вод у меня дурацкий вопрос сидит в голове, "Что быстрее, операция...

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


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

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

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