аргументы командной строки

  1. Аргументы командной строки хранятся на стеке?
  2. При вхождение в функцию main адрес возврата сохраняется?
  3. Почему это не вызывает stack overflow (если я правильно понимаю адрес возврата хранится на стеке)
void gf() {
    gf();
}

int main() {
    gf();
}

А это сразу же вызывает исключение

void gf() {
    gf();
    std::cout << 1;
}

int main() {
    gf();
}

Ответы (1 шт):

Автор решения: Harry

Аргументы командной строки хранятся на стеке?

Вообще-то это дело компилятора, где их хранить. Как никакой гарантии, что для другой функции аргументы будут в стеке, а не в регистрах, например...

При вхождение в функцию 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 активно использует стек...

→ Ссылка