Привет Ruslan!
06 Jun 06 14:44, Ruslan Mohniuc писал Alex Mogilnikov:
AM>> Hеочевидно. Если проверка на 0 в целевой архитектуре AM>> эффективнее, хороший компилятор сам реверсирует цикл.
RM> Вы вообще оба про что? идти от 0 до 255 или от 255 до 0 - это два RM> разных цикла. Ведь переменная i иногда и внутри цикла может RM> использоваться,
Почитай что-нибудь о работе оптимизаторов. Конечно же, обсуждаемая оптимизация возможна только в случае, если тело цикла не зависит от его параметра. А рассматриваемом примере оно не зависит. Определить, зависит ли результат от изменения направления счета, компилятор вполне способен.
RM> и никакой компилятор не поручится, что у меня порядок RM> обхода зависящих от i значений некритичен.
Конкретный пример:
========= test.c ========== void foo(int);
void bar(void) { for(int i=5; i < 10; i++) foo('G'); } ===========================
Что мешает компилятору поручится в незавуисимости результата от параметра цикла? Здесь результат выполнения bar() зависит только от количества проходов цикла. Вот какой код генерит gcc3:
======== test.s =========== .file "test.c" .text .p2align 2,,3 .globl bar .type bar, @function bar: pushl %ebp movl %esp, %ebp pushl %ebx movl $4, %ebx pushl %eax .p2align 2,,3 .L5: subl $12, %esp pushl $71 call foo addl $16, %esp decl %ebx jns .L5 movl -4(%ebp), %ebx leave ret .size bar, .-bar .ident "GCC: (GNU) 3.4.2 [FreeBSD] 20040728" ===========================
Смотреть здесь на регистр ebx.
Для сравнения вот второй пример:
======== test.c ======== void foo(int);
void bar(void) { int i=5; while(i--) foo('G'); } ========================
Вот результат его компиляции:
======== test.s ========= .file "test.c" .text .p2align 2,,3 .globl bar .type bar, @function bar: pushl %ebp movl %esp, %ebp pushl %ebx movl $4, %ebx pushl %eax .p2align 2,,3 .L4: subl $12, %esp pushl $71 decl %ebx call foo addl $16, %esp cmpl $-1, %ebx jne .L4 movl -4(%ebp), %ebx leave ret .size bar, .-bar .ident "GCC: (GNU) 3.4.2 [FreeBSD] 20040728" =========================
Как говорится, найдите 10 отличий. Чтобы было легче найти, вот дифф:
========= test.s.diff ==========
-+- test.s.old Wed Jun 7 15:32:28 2006
+++ test.s Wed Jun 7 15:32:56 2006 @@ -10,13 +10,14 @@ movl $4, %ebx pushl %eax .p2align 2,,3
-.L5:
+.L4: subl $12, %esp pushl $71
- decl %ebx call foo addl , %esp
- decl %ebx
- jns .L5
- cmpl $-1, %ebx
- jne .L4 movl -4(%ebp), %ebx leave ret ================================
Мне тут прокомментировать нечего.
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Закрой свой Ворд!