12
votes

Comment obtenir la taille du tas d'un programme

Comment trouver la taille de la mémoire de tas d'un programme C ++ sous la plate-forme Linux? J'ai besoin d'espace mémoire de tas avant l'utilisation de nouveaux ou malloc et aussi après que toute personne aident?

#include <malloc.h>
#include <iostream>
int main()
{

     //here need heap memory space
     unsigned char* I2C_Read_Data= new unsigned char[250];
     //get heap memory space After the usage of new 
     return 0;
 }


5 commentaires

NOUVEAU ET MALLOC N'utilisez pas la même région ...


@Umnyobe: C'est étrange, car généralement neuf appels :: opérateur neuf () , qui est habituellement implémenté via malloc () .. .


Stackoverflow.com/questions/1350819/c-free-Store-vs-heap


Permettez-moi de corriger ceci: NOUVEAU et MALLOC NE PAS NON FANITAIRES Utilisez la même région ...


Je ne sais pas, mais j'entends que le magasin libre et le tas peuvent être utilisés de manière interchangeable. Neux-ci peuvent suggérer une fonction pour trouver un espace mémoire dynamique d'un programme C avant et après la répartition et la désallocation?


6 Réponses :


1
votes

Vous pouvez utiliser le GetRlimit Appel de fonction et transmettre le rlimit_data pour la ressource. Cela devrait vous donner la taille du segment de données pour votre programme.


4 commentaires

Merci pour la réponse, pouvez-vous me donner un exemple de code?


Une simple recherche aurait donné des liens comme celui-ci - LinuxQuestions.org/Questions/programmation-9/...


Bonjour, dans ce cas, il montre l'espace mémoire, mais pas changé après que l'espace est attribué.


GetRlimit renvoie la limite pour le tas, pas ce qui est actuellement utilisé



5
votes

Utilisez le profileur de tas de Valgrind: massif


1 commentaires

J'utilise la plate-forme "Arm-Linux" .... Comment Valgrind peut être utilisé avec cette plate-forme? Une idée?



6
votes

Vous pouvez également ajouter un suivi de tas à vos propres programmes en surchargeant le nouveau Nouveau et Supprimer opérateurs. Dans Un moteur de jeu je travaille sur, j'ai toutes les réparations de la mémoire à travers des fonctions spéciales, qui attachent chaque allocation à un objet de suivi en tas particulier. De cette façon, à un moment donné, je peux extraire un rapport et voir combien de mémoire est adoptée par des entités, des acteurs, des scripts Lua, etc.

Ce n'est pas aussi minutieux que l'utilisation d'un profileur externe (en particulier lorsque des bibliothèques extérieures gèrent leur propre gestion de la mémoire), mais c'est très agréable de voir exactement quelle mémoire vous étiez responsable.

échantillon de mes tables de mémoire


0 commentaires

0
votes

Outre l'inspection externe, vous pouvez également instruminer votre implémentation de MALLOC pour vous permettre d'inspecter ces statistiques. Jemalloc et TCMALLOC Les implémentations sont des implémentations qui, en plus de mieux performer pour le code multithreadé que les implémentations de libc typiques, ajoutent des fonctions utilitaires de ce type.

Pour creuser plus profondément, vous devez apprendre un peu plus de quoi fonctionne une allocation de tas. En fin de compte, le système d'exploitation est celui qui attribue la mémoire aux processus tels qu'ils le demandent, mais les demandes du système d'exploitation (SysCalls) sont plus lentes que les appels réguliers, donc en général une implémentation de Malloc demandera de gros morceaux à Le système d'exploitation (blocs de 4 kb ou de 8 kb sont courants) et les subdivisez-les à leur servir à ses appelants.

Vous devez déterminer si vous êtes intéressé par la mémoire totale consommée par le processus (qui inclut le code lui-même), la mémoire du processus demandé à partir du système d'exploitation dans un appel de procédure particulier, la mémoire utilisée réellement par le MALLOC Mise en œuvre (qui ajoute ses propres frais généraux de comptage de livres, aussi petit) ou la mémoire vous demandée.

En outre, la fragmentation peut être une douleur pour les deux derniers et peut quelque peu brouillard les différences entre vraiment utilisées et assignées à.


0 commentaires

2
votes

sur Linux, vous pouvez lire / proc / [pid] / statm code> pour obtenir des informations d'utilisation de la mémoire.

fournit des informations sur l'utilisation de la mémoire, mesurée en pages. Les Les colonnes sont: p>

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)


1 commentaires

Les unités sont des pages. Vous pouvez utiliser getconf page_size pour savoir comment une grande page est en octets.



0
votes

Vous pouvez essayer "Mallinfo" et "Malloc_info". Ils pourraient travailler. Mallinfo a des problèmes lorsque vous allouez plus de 2 Go. Malloc_info est une o / s spécifique et notamment très étrange. Je suis d'accord - très souvent, il est agréable de faire ce genre de choses sans outils tiers.


0 commentaires