J'essaie d'apprendre les deux détails sur les travaux d'utilisation de la mémoire, ainsi que la façon de mesurer en utilisant C++. Je sais que sous Windows, un moyen rapide pour récupérer la quantité de RAM utilisée par le processus d'application en cours, en incluant <Windows.h>
, est:Impossible de mesurer l'utilisation de la mémoire des baies statiques avec GetProcessMemoryInfo
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
(uint64_t)info.WorkingSetSize;
Ensuite, je que pour exécuter un test très simple:
#include <iostream>
#include <Windows.h>"
int main(void)
{
uint64_t currentUsedRAM(0);
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;
const int N(1000000);
int x[N]; //in the second run, comment this line out
int y[N]; //in the second run, comment this line out
//int *x = new int[N]; //in the second run UNcomment this line out
//int *y = new int[N]; //in the second run UNcomment this line out
for (int i = 0; i < N; i++)
{
x[i] = 1;
y[i] = 2;
}
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize - currentUsedRAM;
std::cout << "Current RAM used: " << currentUsedRAM << "\n";
return 0;
}
Ce que je ne comprends pas du tout quand je lance le code ci-dessus, la sortie est: Current RAM used: 0
, alors que je me attendais quelque chose autour de 8MB depuis que je remplissais deux 1D int
des tableaux de 1 million d'entrées chacun. Maintenant, si je réexécute le code mais en faisant x
et y
devenir des tableaux alloués dinamiquement, maintenant la sortie est, comme prévu: Current RAM used: 8007680
.
Pourquoi est-ce? Comment faire pour détecter l'utilisation de la mémoire dans les deux cas?
Je suis surpris que votre programme démarre même, car vous allouez près de 8 Mo de mémoire sur la pile pour les deux baies. La taille de pile par défaut sur Windows est généralement un seul Mo. Et avec cela, vous devriez également obtenir un indice sur la raison pour laquelle vous n'obtenez pas le résultat attendu. –
@Someprogrammerdude C'est ** exactement ** ce qui a eu mon doute. Mon intuition était précisément que la fonction ne mesurait que l'allocation de mémoire au tas, pas à la pile. Cependant, parce que l'application fonctionne, je ne pouvais pas comprendre ce qui se passait. Donc, c'est juste que la fonction n'obtient que l'utilisation de la mémoire de tas. Existe-t-il un moyen de calculer l'utilisation de la mémoire de la pile? –
La compilation a optimisé ces deux tableaux. Vous pouvez faire un effet de bord pour éviter cela: essayez de sortir la somme de leur élément. – felix