J'écris un programme (un démonstrateur de théorèmes), dont l'exigence de mémoire est "autant que possible, s'il vous plaît"; c'est-à-dire, il peut toujours faire mieux en utilisant plus de mémoire, à des fins pratiques sans limite supérieure, donc ce qu'il faut réellement faire est d'utiliser autant de mémoire que disponible, ni plus, ni moins. Je peux comprendre comment classer les données par ordre de priorité pour supprimer les données les moins coûteuses lorsque la mémoire est insuffisante; le problème que j'essaie de résoudre est comment savoir quand cela se produit.Garder l'utilisation de la mémoire dans les limites de la quantité disponible
Idéalement je voudrais un appel système qui retourne "combien de mémoire il reste" ou "avons-nous encore de la mémoire?"; pour autant que je peux dire, aucune telle chose n'existe?
Bien sûr, malloc peut signaler un manque de mémoire en retournant 0 et new peut appeler un gestionnaire; ce ne sont pas des signaux idéaux, mais ce serait mieux que rien. Un problème, cependant, est que je veux vraiment savoir quand la mémoire physique est épuisée, de sorte que je peux éviter d'aller profondément dans l'échange et de faire ainsi tout s'arrêter; Je ne pense pas qu'il y ait moyen de se demander "devons-nous encore échanger?" ou dire au système d'exploitation "ne pas échanger sur mon compte, juste échouer mes demandes s'il s'agit de cela"?
Une autre approche consisterait à déterminer la quantité de RAM dans la machine et à surveiller la quantité de mémoire utilisée actuellement par le programme. Pour autant que je sache, il n'y a généralement aucun moyen de dire le premier? J'ai aussi l'impression qu'il n'y a pas de moyen fiable de dire à ce dernier sauf en encapsulant malloc/free avec une fonction bookkeeper (ce qui est alors plus problématique en C++).
Y a-t-il des approches qui me manquent?
L'idéal serait une solution portable, mais je soupçonne que cela n'arrivera pas. A défaut, une solution qui fonctionne sur Windows et une autre qui fonctionne sur Unix serait bien. A défaut, je pourrais me débrouiller avec une solution qui fonctionne sur Windows et une autre qui fonctionne sous Linux.
Eh bien, tout ce que je peux dire à coup sûr, c'est que vous ne trouverez pas de solution portable. Oh, et que ce n'est pas la tâche la plus facile. – sbi
Sur Linux: http://linux.die.net/man/2/getrusage peut-être? Sous Windows: GetProcessMemoryInfo peut-être? –