Вопрос по int, parameters, memory, short, c++ – Рекурсия в Visual Studio

2

Когда я запустил этот очень простой рекурсивный код, я обнаружил, что когда функция «recursCheck ()» использует целочисленные параметры, моя память перепрыгивает до 200 МБ в режиме Win32 и до 45 МБ в режиме x64, а когда параметр имеет тип «short «Используемая память составляет 4,7 МБ в режиме Win32 и 1,7 МБ для x64. sizeof (int) показывает 4 байта, а sizeof (short) показывает 2 байта. Как это возможно - 1 000 000 x 2 байта = 2 МБ и 1 000 000 x 4 байта = 4 МБ НЕ 200 МБ !!!Так почему же эта проблема возникает (short против int) и почему режим Win32 занимает меньше памяти, чем x64? Я использую Visual Studio 2013, 64-битную ОС Windows7, CPU i5, 4 ГБ оперативной памяти. Та же проблема возникает в Visual Studio 2008, но там используется еще больше памяти - 400 МБ вместо 200 МБ.

#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" типа "short":изображение 2

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

@ Matthew Рекурсивная часть ничего не делает, поэтому она полностью оптимизирована в режиме релиза. ТелоrecursCheck сводится к вызовуsystem, который сам оптимизируется в хвостовой вызов наx64 (Я был весьма впечатлен этой последней частью, если честно). bogdan
@nicksona, какую сборку вы используете: отладку или релиз? BogolyubskiyAlexey
A short не может содержать значение 1000000, поэтому оно будет рекурсивно реже повторяться. Bo Persson
Режим выпуска, вероятно, включает в себя оптимизацию рекурсии хвостового вызова, чтобы предотвратить рост стека. Matthew

Ваш Ответ

0   ответов

Похожие вопросы