jeudi 1 août 2013

StackOverflow

tiré de: Whitaker, C# Crash Course
traduction: GrosseFille

STACK vs HEAP

Lors de la mise en march d'un programme C#, l'ordinateurvous octroie de l'espace mémoire pour de l'information. Cet endroit comprend une division, que l'on nomme stack(pile) et heap(montagne) respectivement. Ces appellations décrivent comment l'information y est stockée.

Dans le stack on retrouve les variables ordinaires (telles les ints et les doubles). On y retrouve aussi d'autres informations. À l'appel d'une méthode, on y place de l'information qui permet à l'ordi de se souvenir d'où il en était au moment de l'appel de la méthode. Ainsi, au retour de la méthode, l'ordi sait où aller.

Par ailleurs, toutes les variables à l'intérieure de la méthode sont placées dans le stack. Pour une dite méthode, toute l'information est regroupée, dans ce que l'on nomme un frame(cadre). Voilà donc qu'un appel de méthode crée un frame sur le stack. À l'instar de son nom, chaque frame est stacked(empilé) sur un autre, fidèle à l'ordre d'appel.

En référence au tuto sur le récursif, qui peut nous valoir une StackOverflowException, nous voilà donc en mesure d'apprécier l'erreur. On y aura créé tellement d'appels de la méthode que le stack ne suffisait plus à tout stocker.

Les objets, par contre, se retrouvent sur la heap. Disons que nous créons un nouvel objet Random(Aléatoire), c'est-à-dire, une instance de la classe Random; toute l'information qui y a trait va se trouver dans la heap. La heap ne répond à aucun principe d'odre particulier. C'est ce que son nom indique - un amas.

Afin de garder un lien avec l'objet, on utilise une référence placée dans le stack. Ce qui fait que le gros de l'information sur l'objet sera dans la heap, et l'utilisateur en garde une référence dans le stack. Pour un adepte du C#/C++, la notion de référence ici rejoint celle de pointer de ces langages. Nous avons toujours un contact avec ces objets par le biais d'une référence; ce qui aura des répercussions pour la programmation.

Pour l'instant souvenons-nous que les types passibles de valuation, telles les variables (int, bool, double, etc) vont résider sur le stack; et que les types référentiels - objets - seront placés dans la heap, avec une référence, voir plusieurs, dans le stack.

Aucun commentaire: