Рекурсия във Visual Studio

Когато стартирам този много прост рекурсивен код, открих, че когато функцията „recursCheck()“ използва целочислени параметри, паметта ми скача до 200 MB в режим Win32 и 45 MB в режим x64, а когато параметърът е от тип „къс " използваната памет е 4,7 MB Win32 режим и 1,7 MB за x64. sizeof(int) показва 4 байта, а sizeof(short) показва 2 байта. Как е възможно това - 1 000 000 х 2 байта = 2 MB и 1 000 000 х 4 байта = 4 MB НЕ 200 MB !!! И така, защо този проблем се появява (кратко срещу int) и защо режимът Win32 отнема по-малко памет от x64? Използвам Visual Studio 2013, 64-битова ОС Windows7, CPU i5, 4 GB RAM. Същият проблем се случва във Visual Studio 2008, но там се заема още повече памет - 400 MB вместо 200 MB.

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#define SIZE_T_T 1000000
using namespace std;

void recursCheck(int i);

int main()
{
    //cout << sizeof(int) << endl;
    int i = SIZE_T_T;
    recursCheck(i);

    system("PAUSE");
    return 0;
}

void recursCheck(int i)
{
    //cout << i << endl;
    if (i != 0)
    {
        recursCheck(--i);
    }
    else
    {
        system("PAUSE");
    }
}

Win32 РЕЖИМ С „i“ от тип „int“: изображение 1 Win32 РЕЖИМ С „i“ от тип "кратко": изображение 2

Разбрах също, че преди втората система ("ПАУЗА") преди края на основната програма паметта ВСЕ ОЩЕ Е използвана. Знам, че C++ неt manage memory, but shouldnне когато всички функции "recursCheck()" завършват, паметта за токени се освобождава? Губя смисъла на ЛОКАЛНАТА променлива. Как виждате параметърът се предава ПО СТОЙНОСТ. НЕ ТРЯБВА ЛИ ДА СЕ ОСВОБОЖДАВА АВТОМАТИЧНО СЛЕД КРАЙ НА ФУНКЦИЯТА?


person nicksona    schedule 11.09.2015    source източник
comment
short не може да задържи стойността 1000000, така че вероятно ще рекурсира по-малко пъти.   -  person Bo Persson    schedule 11.09.2015
comment
О, да, точно сега разбирам и защо толкова много памет се заема от цели числа, когато са 4 байта и защо в режим x64 заетата памет е по-малко от Win32 и защо паметта все още се заема преди връщане 0; на основната функция???   -  person nicksona    schedule 11.09.2015
comment
Не само аргументите се поставят в стека; адресът за връщане също се изпраща и компилаторът може също да генерира код за настройка на стекови рамки за всяко извикване на функция. На кое ниво на оптимизация изграждате?   -  person Michael    schedule 11.09.2015
comment
@nicksona, каква компилация използвате: отстраняване на грешки или освобождаване?   -  person BogolyubskiyAlexey    schedule 11.09.2015
comment
Използвал съм Debug. WoW, когато използвам release, всъщност пада до 1 MB.   -  person nicksona    schedule 11.09.2015
comment
Режимът на освобождаване вероятно включва оптимизирането на рекурсията на опашката, за да се предотврати нарастването на стека.   -  person Matthew    schedule 11.09.2015
comment
@Matthew Рекурсивната част не прави нищо, така че всъщност е напълно оптимизирана в режим на освобождаване. Тялото на recursCheck е намалено до извикване на system, което само по себе си е оптимизирано в опашка на x64 (честно казано, бях доста впечатлен от тази последна част).   -  person bogdan    schedule 12.09.2015