аргументы командной строки
- Аргументы командной строки хранятся на стеке?
- При вхождение в функцию main адрес возврата сохраняется?
- Почему это не вызывает stack overflow (если я правильно понимаю адрес возврата хранится на стеке)
void gf() {
gf();
}
int main() {
gf();
}
А это сразу же вызывает исключение
void gf() {
gf();
std::cout << 1;
}
int main() {
gf();
}
Ответы (1 шт):
Аргументы командной строки хранятся на стеке?
Вообще-то это дело компилятора, где их хранить. Как никакой гарантии, что для другой функции аргументы будут в стеке, а не в регистрах, например...
При вхождение в функцию main адрес возврата сохраняется?
В принципе функция main() такая же функция, как и другие, и после выхода из нее выполняется масса работы по "уборке" и завершению программы. Так что адрес возврата из нее хранится, как и у других функций.
Почему это не вызывает stack overflow (если я правильно понимаю адрес возврата хранится на стеке)
Вероятно, потому что оптимизатор :) В первом случае он не выполняет вызов. Вот в VC++2019:
_TEXT SEGMENT
?gf@@YAXXZ PROC ; gf, COMDAT
; 17 : void gf() {
npad 2
$LL3@gf:
; 18 : gf();
jmp SHORT $LL3@gf
?gf@@YAXXZ ENDP ; gf
_TEXT ENDS
как видите, простой jmp, стек не используется. А если добавить cout <<, то
?gf@@YAXXZ PROC ; gf, COMDAT
; 17 : void gf() {
$LN4:
sub rsp, 40 ; 00000028H
; 18 : gf();
call ?gf@@YAXXZ ; gf
; 19 : cout << 1;
mov edx, 1
lea rcx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
; 20 : }
add rsp, 40 ; 00000028H
; 19 : cout << 1;
jmp ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
?gf@@YAXXZ ENDP ; gf
и вот это sub rsp, 40 активно использует стек...