web-dev-qa-db-fra.com

Comment obtenir l'utilisation de la mémoire sous Windows en C ++

J'essaie de savoir combien de mémoire mon application consomme dans le programme lui-même. L'utilisation de la mémoire que je recherche est le nombre indiqué dans la colonne "Utilisation Mem" de l'onglet Processus du Gestionnaire des tâches de Windows.

43
Brian Stewart

Un bon point de départ serait GetProcessMemoryInfo , qui rapporte diverses informations de mémoire sur le processus spécifié. Vous pouvez passer GetCurrentProcess() comme descripteur de processus afin d'obtenir des informations sur le processus appelant.

Probablement le membre WorkingSetSize de PROCESS_MEMORY_COUNTERS est la correspondance la plus proche du couloir d'utilisation de Mem dans le gestionnaire de tâches, mais ce ne sera pas exactement la même chose. J'expérimenterais avec les différentes valeurs pour trouver celle qui est la plus proche de vos besoins.

45
Charlie

Je pense que c'est ce que vous cherchiez:

#include<windows.h>
#include<stdio.h>   
#include<tchar.h>

// Use to convert bytes to MB
#define DIV 1048576

// Use to convert bytes to MB
//#define DIV 1024

// Specify the width of the field in which to print the numbers. 
// The asterisk in the format specifier "%*I64d" takes an integer 
// argument and uses it to pad and right justify the number.

#define WIDTH 7

void _tmain()
{
  MEMORYSTATUSEX statex;

  statex.dwLength = sizeof (statex);

  GlobalMemoryStatusEx (&statex);


  _tprintf (TEXT("There is  %*ld percent of memory in use.\n"),WIDTH, statex.dwMemoryLoad);
  _tprintf (TEXT("There are %*I64d total Mbytes of physical memory.\n"),WIDTH,statex.ullTotalPhys/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of physical memory.\n"),WIDTH, statex.ullAvailPhys/DIV);
  _tprintf (TEXT("There are %*I64d total Mbytes of paging file.\n"),WIDTH, statex.ullTotalPageFile/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of paging file.\n"),WIDTH, statex.ullAvailPageFile/DIV);
  _tprintf (TEXT("There are %*I64d total Mbytes of virtual memory.\n"),WIDTH, statex.ullTotalVirtual/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of virtual memory.\n"),WIDTH, statex.ullAvailVirtual/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of extended memory.\n"),WIDTH, statex.ullAvailExtendedVirtual/DIV);


}
19
Ronin

GetProcessMemoryInfo est la fonction que vous recherchez. Les documents sur MSDN vous orienteront dans la bonne direction. Obtenez les informations souhaitées de la structure PROCESS_MEMORY_COUNTERS que vous transmettez.

Vous devrez inclure psapi.h.

8
Adzm

Essayez de regarder GetProcessMemoryInfo . Je ne l'ai pas utilisé, mais il ressemble à ce dont vous avez besoin.

7
Mark Ransom

Pour compléter la réponse de Ronin, indead la fonction GlobalMemoryStatusEx vous donne les bons compteurs pour dériver l'utilisation de la mémoire virtuelle pour le processus d'appel: il suffit de soustraire ullAvailVirtual de ullTotalVirtual pour être alloué mémoire virtuelle. Vous pouvez vérifier cela par vous-même en utilisant ProcessExplorer ou quelque chose.

Il est déroutant que l'appel système GlobalMemoryStatusEx ait malheureusement un objectif mixte: il fournit à la fois des informations à l'échelle du système et spécifiques au processus, par exemple informations sur la mémoire virtuelle.

2
Aris Koning