Цитата
if (++i > k)
goto 1branch
else
goto 2branch
Language: cpp
if (i++ > k)
goto 1branch
else
goto 2branch
Этот пример не удачный, т.к. тут выполняются разные по семантике задачи.
Цитата(Litkevich Yuriy @ 21.7.2008, 11:43)
я говорил о вменяемом компиляторе, но не бесплатном, в IAR разницы ни какой, я давно про эту особенность Си прочитал, и смотрел результат работы разных компиллеров. в HiTech и IAR нет разницы, просто люди умеют писать оптимизирующие копиллеры. А GNU это бесплатный компиллер, с минимально возможной оптимизацией, как там прочие поживают не в курсе.
Так я про это и говорю, что для GNU компилеров делается и это нужно учитывать.
Цитата(AD @ 21.7.2008, 11:01)
Для целочисленного типа и простых итераторах для современных компиляторов разницы не будет, насколько я знаю от программистов, которые делают встроенное ПО для авиации! Я еще только учусь на такого программиста, но встроенное ПО пока что не доверяют.
Для итераторов есть и очень существенная, при случае скажи об этом вашем программистам и еще книги посоветуй им почитать про стандартную библиотеку, раз таких основ не знают. Могут так же посмотреть исходные коды STL и подумать, почему там написано так и именно так, и никак иначе.
Вот пример, как генерируется код для типов, у которых определены собственные инкрементные операторы ++ (и для итераторов тоже, вне зависимости от компилятора).
Вот такой код генерируются для ++a; (69 строк)
.file "main.cpp"
.text
.align 2
.globl main
.type main, @function
main:
.LFB8:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $8, %esp
.LCFI2:
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $8, %esp
pushl $0
leal -4(%ebp), %eax
pushl %eax
.LCFI3:
call _ZN1AC1Ei
addl $16, %esp
subl $12, %esp
leal -4(%ebp), %eax
pushl %eax
call _ZN1AppEv
addl $16, %esp
movl $0, %eax
leave
ret
.LFE8:
.size main, .-main
.section .gnu.linkonce.t._ZN1AC1Ei,"ax",@progbits
.align 2
.weak _ZN1AC1Ei
.type _ZN1AC1Ei, @function
_ZN1AC1Ei:
.LFB9:
pushl %ebp
.LCFI4:
movl %esp, %ebp
.LCFI5:
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl %eax, (%edx)
popl %ebp
ret
.LFE9:
.size _ZN1AC1Ei, .-_ZN1AC1Ei
.section .gnu.linkonce.t._ZN1AppEv,"ax",@progbits
.align 2
.weak _ZN1AppEv
.type _ZN1AppEv, @function
_ZN1AppEv:
.LFB10:
pushl %ebp
.LCFI6:
movl %esp, %ebp
.LCFI7:
movl 8(%ebp), %eax
incl (%eax)
movl 8(%ebp), %eax
popl %ebp
ret
.LFE10:
.size _ZN1AppEv, .-_ZN1AppEv
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.4"
А вот такой код для a++ (101 строка)
.file "main.cpp"
.text
.align 2
.globl main
.type main, @function
main:
.LFB8:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $8, %esp
.LCFI2:
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $8, %esp
pushl $0
leal -4(%ebp), %eax
pushl %eax
.LCFI3:
call _ZN1AC1Ei
addl $16, %esp
leal -8(%ebp), %edx
subl $4, %esp
pushl $0
leal -4(%ebp), %eax
pushl %eax
pushl %edx
call _ZN1AppEi
addl $12, %esp
movl $0, %eax
leave
ret
.LFE8:
.size main, .-main
.section .gnu.linkonce.t._ZN1AC1Ei,"ax",@progbits
.align 2
.weak _ZN1AC1Ei
.type _ZN1AC1Ei, @function
_ZN1AC1Ei:
.LFB9:
pushl %ebp
.LCFI4:
movl %esp, %ebp
.LCFI5:
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl %eax, (%edx)
popl %ebp
ret
.LFE9:
.size _ZN1AC1Ei, .-_ZN1AC1Ei
.section .gnu.linkonce.t._ZN1AppEi,"ax",@progbits
.align 2
.weak _ZN1AppEi
.type _ZN1AppEi, @function
_ZN1AppEi:
.LFB10:
pushl %ebp
.LCFI6:
movl %esp, %ebp
.LCFI7:
pushl %ebx
.LCFI8:
subl $4, %esp
.LCFI9:
movl 8(%ebp), %ebx
movl 12(%ebp), %eax
movl (%eax), %eax
movl %eax, (%ebx)
subl $12, %esp
pushl 12(%ebp)
.LCFI10:
call _ZN1AppEv
addl $16, %esp
movl %ebx, %eax
movl -4(%ebp), %ebx
leave
ret $4
.LFE10:
.size _ZN1AppEi, .-_ZN1AppEi
.section .gnu.linkonce.t._ZN1AppEv,"ax",@progbits
.align 2
.weak _ZN1AppEv
.type _ZN1AppEv, @function
_ZN1AppEv:
.LFB11:
pushl %ebp
.LCFI11:
movl %esp, %ebp
.LCFI12:
movl 8(%ebp), %eax
incl (%eax)
movl 8(%ebp), %eax
popl %ebp
ret
.LFE11:
.size _ZN1AppEv, .-_ZN1AppEv
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.4"
Вот код на С++, который тестировался :
class A
{
public:
A(int val) : m_val(val) {}
A & operator ++ ()
{
++m_val;
return *this;
}
A operator ++(int)
{
A temp(*this);
++*this;
return temp;
}
int m_val;
};
int main()
{
A a(0);
a++;
//++a;
return 0;
}