web-dev-qa-db-fra.com

Comment augmenter la mémoire maximale allouée sur la pile / le tas

  • Comment augmenter la mémoire maximale allouée sur la pile/tas pour un programme en C++?

  • L'augmentation de RAM de votre ordinateur augmentera-t-elle automatiquement la mémoire de pile/tas d'un programme informatique?

19
Computernerd

Dans Visual C++, vous pouvez utiliser la directive #pragma. Par exemple:

#pragma comment(linker, "/STACK:2000000")
#pragma comment(linker, "/HEAP:2000000")
9
VeLKerr

Deuxième édition: D'après votre commentaire, vous travaillez dans Windows, donc ma réponse Unix ci-dessous ne vous serait pas très utile. Mais voir Déterminer l'espace de pile avec Visual Studio et Taille maximale de pile C/C++ du programme .

La taille stack est assez souvent limitée sous Linux. La commande ulimit -s donnera la valeur actuelle, en kilo-octets. Vous pouvez modifier la valeur par défaut dans (généralement) le fichier /etc/security/limits.conf.

Vous pouvez également, en fonction des privilèges, le modifier pour chaque processus à l'aide de setrlimit(). Voir par exemple ma réponse à faute de segmentation: allocation de pile dans un programme C dans Ubuntu lorsque bufffer> 4M .

Pour tas, voir par exemple Limitation de la taille du tas en C . Mais je ne pense pas que vous puissiez augmenter ou diminuer la taille maximale.

5
Joseph Quinsey

Vous pouvez spécifier la taille de tas réservée et la taille de pile avec les options de lien/Tas et/Pile dans Visual Studio. Pour plus de détails, consultez ces articles MSDN:

  1. allocation de tas
  2. Allocation de pile
5
Matt

La taille de segment de mémoire d'un processus est généralement limitée par la mémoire maximale que le processus peut allouer. Le tas n'a pas besoin d'être contigu (sauf si vous faites quelque chose comme malloc (1000000000)) pour que le tas puisse utiliser la plupart de l'espace d'adressage disponible.

Sous Windows, la taille maximale du processus varie en fonction de deux facteurs.

Sous Windows 32 bits, un processus 32 bits peut allouer par défaut 2 Go. Si Windows est démarré à l'aide du commutateur/3GB et que le processus est compilé à l'aide de l'indicateur de l'éditeur de liens "Activer les grandes adresses", le processus peut allouer 3 Go.

Sous Windows 64 bits, un processus 32 bits par défaut peut allouer 2 Go. Si le processus est lié à "Activer les grandes adresses", Windows 64 bits permet à un processus 32 bits d'allouer 4 Go.

Un processus 64 bits (sous Windows 64 bits) peut allouer quelque chose comme 16 000 Go.

3
brian beuning

J'obtenais un problème de mémoire avec la taille de réserve par défaut du tas et de la pile de 1 Mo. Mais lorsque j'ai défini les propriétés ci-dessus à 2 Mo (2000000), cela fonctionne bien.

Pour définir ces propriétés dans l'environnement de développement Visual Studio, veuillez suivre les étapes ci-dessous.

  • Ouvrez la boîte de dialogue Pages de propriétés du projet.
  • Cliquez sur le dossier Linker.
  • Cliquez sur la page de propriétés Système.
  • Modifier Heap Reserve Size et Stack Reserve Size.
1
Pabitra Dash