Объясните причину следующего явления.
есть код:
struct ab {
int a;
int b;
ab () : a(1), b(2) {}
~ab () {}
};
void func ( ab& ){
}
void main () {
ab AB;
func (AB);
}
После компиляции получаем код функции main:
main:
pushl %ebp
movl %esp,%ebp
subl $36,%esp
pushl %ebx
call __get_eh_context
movl %eax,%ebx
movl $1,-8(%ebp)
movl $2,-4(%ebp)
movl 4(%ebx),%edx
movl 4(%edx),%eax
movl %eax,-20(%ebp)
movl $_$_2ab,-16(%ebp)
leal -8(%ebp),%eax
movl %eax,-12(%ebp)
leal -20(%ebp),%ecx
movl %ecx,4(%edx)
addl $-12,%esp
pushl %eax
call func__FR2ab
movl 4(%ebx),%edx
movl 4(%edx),%eax
movl (%eax),%eax
movl %eax,4(%edx)
xorl %eax,%eax
movl -40(%ebp),%ebx
leave
ret
Если закомментировать деструктор, получим ожидаемый компактный код:
main:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
leal -8(%ebp),%eax
movl $1,-8(%ebp)
movl $2,4(%eax)
addl $-12,%esp
pushl %eax
call func__FR2ab
xorl %eax,%eax
leave
ret
Почему компилятор так делает и можно ли от этого вылечиться?
Использовался компилятор gcc version 2.95.4 20020320 [FreeBSD]