Article de reference

Allocation de mémoire basée sur la pile

( Apprenez comment et quand supprimer ce message ) Une pile classique stocke les données locales et les informations d'appel des procédures imbriquées (qui ne sont pas nécessair...

Une pile classique stocke les données locales et les informations d'appel des procédures imbriquées (qui ne sont pas nécessairement des procédures imbriquées ). Cette pile croît vers le bas à partir de son origine. Le pointeur de pile pointe vers la donnée la plus haute de la pile. Une opération d'empilement décrémente le pointeur et copie les données sur la pile ; une opération de dépilement copie les données de la pile puis incrémente le pointeur. Chaque procédure appelée dans le programme stocke ses informations de retour (en jaune) et ses données locales (dans d'autres couleurs) en les empilant.

Dans les architectures informatiques, les piles sont des régions de mémoire où les données sont ajoutées ou supprimées selon le principe du dernier entré, premier sorti (LIFO) .

Dans la plupart des systèmes informatiques modernes, chaque thread dispose d'une zone mémoire réservée appelée pile. Lors de son exécution, une fonction peut ajouter des données d'état local au sommet de la pile ; à sa sortie, elle est responsable de la suppression de ces données. Au minimum, la pile d'un thread sert à stocker l'adresse de retour fournie par l'appelant, permettant ainsi aux instructions de retour de s'exécuter à l'emplacement correct.

La pile est souvent utilisée pour stocker des variables de longueur fixe, locales aux fonctions actives. Les programmeurs peuvent également choisir d'utiliser explicitement la pile pour stocker des données locales de longueur variable. Si une zone mémoire se trouve sur la pile du thread, on dit qu'elle a été allouée sur la pile ; il s'agit alors d'une allocation de mémoire basée sur la pile (SBMA). Ceci contraste avec l' allocation de mémoire basée sur le tas (HBMA). La SBMA est souvent étroitement liée à la pile d'appels de fonctions .

d'allocation de mémoire dynamique ), par exemple en C.longjmp` si le déplacement a eu lieu avant l'appel à ` plantage dû à un dépassement de capacité de la pile . C'est pourquoi les fonctions utilisant `std::limits` des pointeurs de pile et de cadre (avec des cadres de pile de taille fixe, le pointeur de pile est redondant car il est multiplié par la taille de chaque cadre). Cette approche est généralement bien moins coûteuse que l'appel à `alloca` de type Unix, ainsi que Microsoft Windows, implémentent une fonction permettant malloc. Le compilateur la traduit généralement en instructions intégrées manipulant le pointeur de pile, comme pour les tableaux de longueur variable . Bien qu'il ne soit pas nécessaire de libérer explicitement la mémoire, un risque de comportement indéfini dû à un dépassement de capacité de la pile existe. Cette fonction était présente sur les systèmes Unix dès la version 32/V (1978), mais ne fait partie ni du langage C standard ni d'aucune norme POSIX .

Une version plus sûre de cette fonctionnalité, gnulib propose une interface équivalente, mais au lieu de lever une exception SEH en cas de dépassement, elle délègue la x86 , disposent d'instructions spécifiques pour manipuler la pile du thread en cours d'exécution. D'autres familles, telles que RISC-V , PowerPC et MIPS , ne prennent pas explicitement en charge la pile, mais s'appuient sur des conventions et délèguent sa gestion à l' interface binaire d'application (ABI) du système d'exploitation .

Auto VLAs

De plus, depuis la version C99 (optionnelle depuis C11), il est possible de créer automatiquement un tableau sur la pile au sein d'une fonction ; on parle alors d' auto VLA ( tableau de longueur variable ). Cette fonctionnalité n'est cependant pas prise en charge en C++ .

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index