Pourquoi les termes «automatique» et «dynamic» sont-ils préférés aux termes «stack» et «tas» dans la gestion de la mémoire C ++?

En rapport avec de nombreuses questions et réponses sur les SO, j’ai appris qu’il était préférable de faire référence aux objects dont la durée de vie est gérée comme résidant dans le stockage automatique plutôt que dans la stack.

De même, les objects alloués dynamicment ne doivent pas être considérés comme résidant sur le tas, mais dans le stockage dynamic.

Je comprends qu’il existe un stockage automatique, dynamic et statique, mais je n’ai jamais vraiment compris la différence entre la stack automatique et la stack dynamic. Pourquoi les premiers sont-ils préférés?

Je ne demande pas ce que signifie stack / tas ou comment fonctionne la gestion de la mémoire. Je demande pourquoi les termes stockage automatique / dynamic sont préférés aux termes stack / tas.

Automatique me dit quelque chose sur la durée de vie d’un object: en particulier, il est automatiquement lié à la scope englobante et sera détruit automatiquement à la fermeture de cette scope.

Dynamic me dit que la durée de vie d’un object n’est pas contrôlée automatiquement par le compilateur, mais qu’elle est sous mon contrôle direct.

Stack est un nom surchargé pour un type de conteneur et pour le protocole de pointeur d’instruction populaire associé, pris en charge par des instructions call et ret communes. Cela ne me dit rien sur la durée de vie d’un object, sauf par le biais d’une association historique avec des durées de vie d’object en C, en raison des conventions populaires relatives aux frameworks de stack. Notez également que dans certaines implémentations, le stockage local des threads se trouve sur la stack d’un thread, mais n’est pas limité à la scope d’une seule fonction.

Heap est à nouveau un nom surchargé, indiquant soit un type de conteneur sortingé, soit un système de gestion en mode libre. Ce n’est pas le seul magasin gratuit disponible sur tous les systèmes, et il ne me dit rien de concret sur la durée de vie d’un object alloué avec new .

La plupart des implémentations utilisent une stack pour sauvegarder des objects avec stockage automatique. Ce n’est pas requirejs par la norme, mais cela fonctionne bien sur la plupart des architectures de CPU de nos jours.

Les implémentations utilisent diverses stratégies pour sauvegarder des objects avec une durée de stockage dynamic. Je ne suis pas sûr qu’un tas soit le meilleur moyen de décrire ce que les allocateurs de mémoire modernes utilisent, mais cela semble être le terme “historique”.

Le stockage automatique / dynamic sont donc les termes que la norme utilise pour classifier les vies (“abstraites”) des objects. Ce sont les termes appropriés à utiliser si vous voulez parler d’objects comme le décrit la norme.
Les stacks et les tas sont des techniques de mise en œuvre (“concrètes”) qui peuvent être utilisées pour les sauvegarder. L’utilisation de ces termes est moins correcte, sauf si vous parlez d’une implémentation spécifique.

Les termes de stockage automatique / dynamic sont préférables simplement parce que c’est ce que la norme exige. Les stacks / tas sont basés sur l’implémentation et peuvent théoriquement être implémentés d’une autre manière.

Techniquement parlant, l’allocation de stack / tas sont des détails d’implémentation, alors que stockage automatique / dynamic sont les termes plus généraux. La norme elle-même ne stipule pas que l’allocateur doit utiliser une stack / tas. Par conséquent, le terme automatique / dynamic est le terme le plus approprié, bien que personnellement je trouve cette distinction un peu trop pédante.

Les termes “durée de stockage statique”, “durée de stockage automatique” et “durée de stockage dynamic” apparaissent dans la norme C ++.

Les termes “stack” et “tas” sont utilisés pour faire référence aux fonctionnalités de la bibliothèque standard ( stack<> , make_heap() , push_heap() , etc.) qui ont peu à voir avec la durée de stockage.

Stack et heap introduisent des concepts liés à la mise en œuvre, tandis que les termes “automatique” et “dynamic” sont plus généraux.