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

i++ vs ++i (циклы) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.85
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
11.06.2011, 15:05     i++ vs ++i (циклы) #1
Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2011, 15:05     i++ vs ++i (циклы)
Посмотрите здесь:

C++ Циклы
циклы for, while C++
C++ циклы
C++ циклы
Циклы WHILE, DO-WHILE. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.06.2011, 15:09     i++ vs ++i (циклы) #2
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
???
По идее разницы в бинарном коде быть не должно, так что для красоты.
Лично я пишу постфиксный из-за билдера, там если поставить for и пробел, то автоматически вставляется цикл с постфиксным инкрементом... =)
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.06.2011, 15:12     i++ vs ++i (циклы) #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для _не_ встроеных типов принципиально писать префиксный, так как постфиксная запись предполагает создание временного объекта.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 17:41     i++ vs ++i (циклы) #4
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
чушь, для стандартных типов нет разницы в скорости
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 17:46     i++ vs ++i (циклы) #5
Maxwe11, есть, просто компиляторы обычно оптимизируют код по их желанию, в таких случаях как for , поэтому разницы и не видно становится
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 18:03     i++ vs ++i (циклы) #6
OstapBender, в ассемблерных командах нет разницы(в скорости) между постфиксом и префиксом и это не зависит от компилятора
Код
int i = 0, j = 0;
00ED139E  mov         dword ptr [i],0  
00ED13A5  mov         dword ptr [j],0  
     7: 	i++;
00ED13AC  mov         eax,dword ptr [i]  
00ED13AF  add         eax,1  
00ED13B2  mov         dword ptr [i],eax  
     8: 	++j;
00ED13B5  mov         eax,dword ptr [j]  
00ED13B8  add         eax,1  
00ED13BB  mov         dword ptr [j],eax
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:07     i++ vs ++i (циклы) #7
Maxwe11,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    v=i++;
004113D3  mov         eax,dword ptr [i] 
004113D6  mov         dword ptr [v],eax 
004113D9  mov         ecx,dword ptr [i] 
004113DC  add         ecx,1 
004113DF  mov         dword ptr [i],ecx 
 
    v=++j;
004113E2  mov         eax,dword ptr [j] 
004113E5  add         eax,1 
004113E8  mov         dword ptr [j],eax 
004113EB  mov         ecx,dword ptr [j] 
004113EE  mov         dword ptr [v],ecx
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 18:09     i++ vs ++i (циклы) #8
OstapBender, где отличие в скорости?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:11     i++ vs ++i (циклы) #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
лады, учту

хотя вот провел тестик
C
1
2
3
4
5
6
7
    int v=0;
 
    for (int i=0; i<INT_MAX/2; )
        v=++i; 
 
 
    std::cout << (double)clock()/CLOCKS_PER_SEC;
выдает 2.328
C
1
2
3
4
5
6
7
    int v=0;
 
    for (int i=0; i<INT_MAX/2; )
        v=i++; 
 
 
    std::cout << (double)clock()/CLOCKS_PER_SEC;
2.593
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.06.2011, 18:25     i++ vs ++i (циклы) #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
11.06.2011, 18:46  [ТС]     i++ vs ++i (циклы) #11
Цитата Сообщение от Maxwe11 Посмотреть сообщение
чушь, для стандартных типов нет разницы в скорости
открыли глаза как не крути mov + add
alex_x_x
11.06.2011, 19:31
  #12

Не по теме:

опять откровения пошли

voral
346 / 326 / 46
Регистрация: 16.03.2008
Сообщений: 1,698
11.06.2011, 20:03     i++ vs ++i (циклы) #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Ни когда не задумывался. Попробовал несколько прогонов. Результаты стабильны:
пре - 3.9
пост - 4.62-4.63

Раньше писал писал постфикс. просто наверное впервые столкнулся именно с такой записью. Последнее время стараюсь приучиться использовать префикс, кроме случаев, когда действительно нужен постфикс.
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
11.09.2011, 19:00     i++ vs ++i (циклы) #14
Я тоже до сих пор использовал в циклах постфиксную форму записи, наверное стоит перейти на префиксную.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.09.2011, 19:20     i++ vs ++i (циклы) #15
Разница по определению должна быть, просто на POD типах вроде int она не заметна, а ассемблерный код может быть одинаковым просто за счёт того, что умный компилятор оптимизирует этот момент. А вот с итераторами С++ разница может быть существенной. По этому, чтобы голову себе не забивать, пишу всегда префиксный оператор
C
1
2
3
int i;
for ( i = 0; i < SOMEWHAT; ++i )
    /*...*/
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 14:03     i++ vs ++i (циклы) #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Согласе, таким методом получаем общее процессорное время, которое включает в себя и переключение на сторонние процессы.

OstapBender, попробуй так
C++
1
2
   for (int i=0; i<INT_MAX/2; i++);
   std::cout << (double)clock()/CLOCKS_PER_SEC;
C++
1
2
   for (int i=0; i<INT_MAX/2; ++i);
   std::cout << (double)clock()/CLOCKS_PER_SEC;
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.09.2011, 15:03     i++ vs ++i (циклы) #17
kazak, повторюсь...
Процессорное время является отличным от фактических часов, потому что оно не включает все потраченное время на ожидание ввода-вывода или когда выполняется некоторый другой процесс. Процессорное время представляется типом данных clock_t, и дано как ряд импульсов времени относительно произвольного базового времени, отмечающего начало одиночного вызова программы.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 15:21     i++ vs ++i (циклы) #18
fasked, опыт показывает обратное) Чем больше запущенных программ, тем больше вернется clock.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.09.2011, 15:47     i++ vs ++i (циклы) #19
kazak, очевидно что в вашем примере i++ оптимизируется в ++i, что про v=i++; сказать нельзя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 16:07     i++ vs ++i (циклы)
Еще ссылки по теме:

с++ циклы C++
Циклы в С++ C++
C++ Циклы в с++

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 16:07     i++ vs ++i (циклы) #20
OstapBender, никакой оптимизации. Просто в цикле нет никакой разницы между постфиксом и префиксом совсем (точнее это характерно для одиночного инкремента, записанного отдельным выражением). Для v=i++ тоже разницы большой нет, меняется только порядок действий. Кстати у меня для присваивания инкремента выдает одинаковый результат для постфикса и префикса 3.14-3.17
Yandex
Объявления
12.09.2011, 16:07     i++ vs ++i (циклы)
Ответ Создать тему
Опции темы

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