Cześć :)
Mamy następującą funkcję:
vector<int> func() {
vector<int> Vec;
//wypelniamy go
return Vec;
}
int main(){
vector<int> vec2= func(); //1
func(); //2
}
Pytanie do komenatarza nr 1:
Chciałbym dowiedzieć się jak odbywa się zwracanie wartości? Z tego co pamiętam, to zwracana wartość wędruje na stosie. Co dalej się z nią dzieje? Widać, że w pierwszym wywołaniu jej wartość zostaje zapamiętana, a w drugim nie. Jak to wygląda dla tych dwóch różnych sytuacji?
Pytanie drugie:
Program 1:
vector<int> func() {
vector<int> Vec;
//wypelniamy go
return Vec;
}
int main(){
vector<int> vec2= func();
}
Program 2:
vector<int> func() {
vector<int> Vec;
//wypelniamy go
return Vec;
}
int main(){
func();
}
Po disassemblowaniu kodu funkcji main() wygląda kod następująco:
0x0000000000400682 <+0>: push %rbp
0x0000000000400683 <+1>: mov %rsp,%rbp
0x0000000000400686 <+4>: sub $0x20,%rsp
0x000000000040068a <+8>: lea -0x20(%rbp),%rax
0x000000000040068e <+12>: mov %rax,%rdi
0x0000000000400691 <+15>: callq 0x400664 <func()>
0x0000000000400696 <+20>: lea -0x20(%rbp),%rax
0x000000000040069a <+24>: mov %rax,%rdi
0x000000000040069d <+27>: callq 0x4006c4 <std::vector<int, std::allocator<int> >::~vector()>
0x00000000004006a2 <+32>: mov $0x0,%eax
0x00000000004006a7 <+37>: leaveq
0x00000000004006a8 <+38>: retq
I to dla obydwu programów tak samo! Jak to możliwe, skoro w jednym wywołaniu to zapamiętujemy?