Je ne comprends pas vraiment quand je devrais allouer de la mémoire sur le tas et quand je devrais l'allouer sur la pile. Tout ce que je sais, c'est que l'allocation sur la pile est plus rapide, mais comme la pile est plus petite, je ne devrais pas l'utiliser pour allouer de grandes structures de données; Quelles autres choses devrais-je prendre en compte pour décider où allouer la mémoire? Edit: où devrais-je allouer des variables d'instance? Allouer sur la pile pour la plupart des objets.Quand dois-je affecter sur le tas? (C++)
Répondre
- Durée de vie == portée.
- Si vous avez besoin de contrôler manuellement la durée de vie de l'objet, l'affecter sur le tas.
- Si l'objet est grand et la pile n'est pas assez grand pour elle, allouer sur le tas.
- Utilisez le (mal noms) idiome RAII dans les cas 2 et 3, il vous permet d'utiliser l'objet sur la pile qui manipulent des ressources qui pourraient être vos objets sur le tas - un bon exemple sont les pointeurs intelligents comme std :: shared_ptr/boost :: shared_ptr.
Je voudrais ajouter quelque chose. 5. Si vous êtes dans C++ 0x, vous pouvez également regarder dans unique_ptr <>. Personnellement, je pense que la sémantique du mouvement est très propre. Cela ne va pas être utile aussi souvent que shared_ptr, mais unique_ptr <> a une sémantique très utile qui le maintient efficace. – Dragontamer5788
Utilisez le segment de mémoire lorsque la mémoire doit persister au-delà de la portée de la fonction en cours.
Vous ne pouvez utiliser la pile comme espace de stockage que lorsque vous savez au moment de la compilation quelle est la taille du stockage dont vous avez besoin. Il en résulte que vous pouvez utiliser la pile pour
- objets simples (comme vous déclarer un
int
oudouble
ou variableMyClass temp1;
- locales tableaux statiquement taille (comme vous le faites lorsque vous déclarez
char local_buf[100];
ouMyDecimal numbers[10];
vous devez utiliser le tas (« magasin gratuit ») lorsque vous ne savez combien d'espace dont vous avez besoin à l'exécution et vous devez utiliser probablement le tas pour grands tampons statiquement connus (comme ne font char large_buf[32*1024*1024];
)
Normalement cependant vous très rarement devrait toucher le tas directement, mais normalement utiliser des objets qui gèrent une mémoire de tas pour vous (et l'objet vit peut-être sur la pile ou en tant que membre d'un autre objet - où vous alors ne vous inquiétez pas celui de l'autre objet)
pour donner quelques exemples de code:
{
char locBuf[100]; // 100 character buffer on the stack
std::string s; // the object s will live on the stack
myReadLine(locBuf, 100); // copies 100 input bytes to the buffer on the stack
s = myReadLine2();
// at this point, s, the object, is living on the stack - however
// inside s there is a pointer to some heap allocated storage where it
// saved the return data from myReadLine2().
}
// <- here locBuf and s go out-of-scope, which automatically "frees" all
// memory they used. In the case of locBuf it is a noop and in the case of
// s the dtor of s will be called which in turn will release (via delete)
// the internal buffer s used.
donc, pour donner une réponse courte à votre question quand: Ne rien allouent sur le tas (via new
) à moins que cela se fait au moyen d'un objet emballage approprié. (Std :: string, std :: vecteur, etc.)
Dans mon expérience allocation de tas est plus utile lorsque vous voulez déclarer la taille d'un tableau d'objets lors de l'exécution.
int numberOfInts;
cout << "How many integers would you like to store?: ";
cin >> numberOfInts;
int *heapArray = new int[numberOfInts];
Ce code vous donnera un tableau pointé de ints de taille numberOfInts. Il est également possible de le faire dans la pile, mais cela est considéré comme dangereux, et vous risquez d'obtenir l'erreur dont ce site porte le nom.
- 1. Très grand tableau sur le tas (Visual C++)
- 2. Quand est-il prudent d'ajouter des valeurs d'objet aux vecteurs sur le tas?
- 3. C++ sift down tas
- 4. procédure max_heapify sur tas
- 5. tas de RSS sur le blog?
- 6. limiter la création d'objet sur tas et pile en C++
- 7. Comment empêcher la création d'un objet sur le tas?
- 8. Point d'arrêt conditionnel quand tas> une certaine limite
- 9. Affecter un événement à div quand il est entièrement chargé
- 10. conteneurs STL sur la pile et le tas
- 11. Recherche sur le bannissement des problèmes d'espace de tas?
- 12. Connaître la taille d'une mémoire réservée sur le tas
- 13. Python et le tas intégré
- 14. Problèmes avec « Tas tampon » Erreur dans C
- 15. Fibonacci, binaire ou tas binomial dans C#?
- 16. Aide sur l'utilisation boost tas amplifié
- 17. C++ empiler les variables et les variables tas
- 18. Affecter zéro pour flotter dans C
- 19. Objective-C performSelector quand utiliser le côlon?
- 20. Le constructeur d'un objet est-il invoqué après la création de l'objet sur le tas (Java)?
- 21. Question sur les syndicats et la mémoire allouée par tas
- 22. comment peut allouer une matrice en utilisant le vecteur sur le tas
- 23. Comment enregistrer le tas (vidage vers un fichier) dans Eclipse?
- 24. Quand le pointeur sur le tableau est-il utile?
- 25. Comment la pile, le tas et le cadre correspondent-ils conceptuellement aux constructions C#?
- 26. Puis-je passer le runtime Visual C++ à un autre tas?
- 27. Objets affectés au tas
- 28. Affecter une liste de valeurs à une structure en C#?
- 29. -Xms: taille initiale du tas ou taille minimale du tas?
- 30. iReport espace de tas java
Duplicata de http://stackoverflow.com/questions/599308/proper-stack-and-heap-usage-in-c –