Когато стартирам този много прост рекурсивен код, открих, че когато функцията „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()" завършват, паметта за токени се освобождава? Губя смисъла на ЛОКАЛНАТА променлива. Как виждате параметърът се предава ПО СТОЙНОСТ. НЕ ТРЯБВА ЛИ ДА СЕ ОСВОБОЖДАВА АВТОМАТИЧНО СЛЕД КРАЙ НА ФУНКЦИЯТА?
short
не може да задържи стойността 1000000, така че вероятно ще рекурсира по-малко пъти. - person Bo Persson   schedule 11.09.2015recursCheck
е намалено до извикване наsystem
, което само по себе си е оптимизирано в опашка наx64
(честно казано, бях доста впечатлен от тази последна част). - person bogdan   schedule 12.09.2015