В древнем Borland C++ Builder 5
Исходный код:
struct Example {
int a;
};
void main() {
Example ex;
ex.a = 1;
ex = Example();
ex.a = 2;
}
Трансляция в ассемблер:
@_main proc near
push ebp
mov ebp,esp
add esp,-8
mov dword ptr [ebp-4],1
mov eax,dword ptr [ebp-8]
mov dword ptr [ebp-4],eax
mov dword ptr [ebp-4],2
mov esp,ebp
pop ebp
ret
@_main endp
Видно, что в начале функции в стеке было зарезервировано место под две копии структуры.
Изменим код
struct Example {
int a;
};
void main(){
Example ex;
ex.a = 1;
for (int i = 0; i < 10; i++) {
ex = Example();
ex.a = i;
}
}
Ассемблер:
@_main proc near
push ebp
mov ebp,esp
add esp,-12
mov dword ptr [ebp-4],1
xor eax,eax
mov dword ptr [ebp-8],eax
@3: mov edx,dword ptr [ebp-12]
mov dword ptr [ebp-4],edx
mov ecx,dword ptr [ebp-8]
mov dword ptr [ebp-4],ecx
inc dword ptr [ebp-8]
cmp dword ptr [ebp-8],10
jl short @3
mov esp,ebp
pop ebp
ret
@_main endp
Опять таки, несмотря на цикл в стеке было зарезервировано место под две структуры, в цикле в переменную каждый раз копируется вторая структура.