Теоретично при виконанні i++ створюється копія i, яку буде повернено як результат операції, тому ++i (де ця копія не створюється) має працювати швидше, але це все дуже компіляторозалежне.Залежить, звичайно. Але якщо говорити про gcc, то такий ефект є.
isbear@monstruozo:~$ echo $'#include\t<stdio.h>\nint main (void)\n{\nint i=2, b=10;\n\n\twhile (i<10000) {\n\t\tb += i++;\n\t\tprintf ("%d, %d", i, b);\n\t}\n\treturn 0;\n}\n' > t.c
isbear@monstruozo:~$ gcc -O3 -o to.s -S t.c
isbear@monstruozo:~$ sed -i -e 's/i++/++i/' t.c
isbear@monstruozo:~$ gcc -O3 -o tr.s -S t.c
isbear@monstruozo:~$ diff -u to.s tr.s
--- to.s 2007-11-11 22:05:57.000000000 +0200
+++ tr.s 2007-11-11 22:06:06.000000000 +0200
@@ -18,12 +18,12 @@
.LCFI2:
.p2align 4,,7
.L2:
- addl %ebx, %ebp
incl %ebx
xorl %eax, %eax
- movl %ebp, %edx
- movl %ebx, %esi
movl $.LC0, %edi
+ addl %ebx, %ebp
+ movl %ebx, %esi
+ movl %ebp, %edx
call printf
cmpl $10000, %ebx
jne .L2
isbear@monstruozo:~$
[/tt] _Self&
operator++()
{
_M_node = _M_node->_M_next;
return *this;
}
_Self
operator++(int)
{
_Self __tmp = *this;
_M_node = _M_node->_M_next;
return __tmp;
}
Ку?
Теоретично при виконанні i++ створюється копія i, яку буде повернено як результат операції, тому ++i (де ця копія не створюється) має працювати швидше, але це все дуже компіляторозалежне.Залежить, звичайно. Але якщо говорити про gcc, то такий ефект є.
2markus: а як ви заміряли? Протестуйте з stl-ними ітераторами, там сумнівів не має залишатись. З gcc преінкремент швидший.
time ./test_op1
А потімtime ./test_op2
Код на С в них (test_op1, test_op2) ідентичний, окрім того в одній робиться nCount++, а в іншій ++nCount, nCount типу int. Код на С в них (test_op1, test_op2) ідентичний, окрім того в одній робиться nCount++, а в іншій ++nCount, nCount типу int.Ну, про C Михайло вже написав.
Теоретично при виконанні i++ створюється копія i, яку буде повернено як результат операції, тому ++i (де ця копія не створюється) має працювати швидше, але це все дуже компіляторозалежне.Залежить, звичайно. Але якщо говорити про gcc, то такий ефект є.
2markus: а як ви заміряли? Протестуйте з stl-ними ітераторами, там сумнівів не має залишатись. З gcc преінкремент швидший.
Проте все-таки цікаво інше: на сучасних апаратах скільки воно виграє? Одну соту долю наносекунди? :) Хіба це допомагає продати більше копій софта й сильно задовільняє кінцевого юзвєря?..Особисто я цим питанням ніколи не переймався, тим більше, існує купа інших способів вбити перформанс. Зараз всюди ліплю преінкремент - звичка виробилась, хоч і в дитинстві робив строго навпаки.
Я-б, наприклад, зовсім інші запитання на співбесіді задавав навіть звичайним кодерам, які по-суті систему не дизайнять, а тільки вбивають код по вже готовій схемі. :)+1, що ще тут сказати...
А в Яндексі взагалі гасло: можеш і взагалі не вміти програмувати — навчимо. Важливо-ж зовсім інше...