{"id":229,"date":"2019-05-02T04:46:32","date_gmt":"2019-05-02T04:46:32","guid":{"rendered":"http:\/\/joffremoncayo.com\/blog\/?p=229"},"modified":"2019-11-28T03:38:11","modified_gmt":"2019-11-28T03:38:11","slug":"la-pila-the-stack-y-el-monticulo-the-heap-en-csharp-dot-net","status":"publish","type":"post","link":"https:\/\/joffremoncayo.com\/blog\/la-pila-the-stack-y-el-monticulo-the-heap-en-csharp-dot-net\/","title":{"rendered":"La Pila (The Stack) y el Mont\u00edculo (The Heap) en C# .NET"},"content":{"rendered":"\n<figure class=\"wp-block-gallery columns-0 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><\/ul><\/figure>\n\n\n<p>Cuando un programa se va a ejecutar, se reserva un espacio de memoria para almacenar su entorno, as\u00ed como tambi\u00e9n los datos que va a utilizar. La cantidad de memoria que ser\u00e1 requerida, donde y como ser\u00e1 almacenada, depender\u00e1 del tipo de dato a declarar.<\/p>\n<p>Al momento de requerir un espacio de memoria, se puden usar dos \u00e1reas distintas, las cuales son administradas de forma diferente. Estas dos \u00e1reas de memoria se llaman: <strong>La Pila<\/strong> (<strong>The Stack<\/strong>) y <strong>El Mont\u00edculo o Mont\u00f3n <\/strong>(<strong>The Heap<\/strong>). Cada una con diferentes prop\u00f3sitos.<\/p>\n<h2>The Stack<\/h2>\n<p><strong>La Pila<\/strong> es un arreglo de memoria que esta ordenado mediante el m\u00e9todo <strong>LIFO<\/strong> (Last-in, First-out), donde el \u00faltimo elemento en entrar es el primero en salir.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-259\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStack1.png\" alt=\"\" width=\"475\" height=\"442\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStack1.png 475w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStack1-300x279.png 300w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStack1-451x420.png 451w\" sizes=\"(max-width: 475px) 100vw, 475px\" \/><\/p>\n<p>Las caracter\u00edsticas generales de la Pila son las siguientes:<\/p>\n<ol>\n<li>Los datos <strong>solamente <\/strong>pueden ser a\u00f1adidos o removidos desde la parte superior de la pila.<\/li>\n<li>Agregar un elemento a la pila se denomina <strong>Pushing<\/strong>.<\/li>\n<li>Remover un elemento de la pila se denomina <strong>Popping<\/strong>.<\/li>\n<li>La pila almacena:\n<ol>\n<li>El entorno de ejecuci\u00f3n del programa actual.<\/li>\n<li>Par\u00e1metros pasados a los m\u00e9todos.<\/li>\n<li>Los valores de ciertos tipos de variables.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Otra forma de describir a La Pila es relacion\u00e1ndola con la forma en que est\u00e1 organizada una<strong> pila de cartones<\/strong>, los cuales se colocan uno encima del otro.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-278\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/PilaCajas.jpg\" alt=\"\" width=\"459\" height=\"612\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/PilaCajas.jpg 459w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/PilaCajas-225x300.jpg 225w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/PilaCajas-315x420.jpg 315w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/p>\n<p>Por ejemplo, cuando se llama a un m\u00e9todo, cada par\u00e1metro se coloca dentro de un cart\u00f3n y luego el mismo se coloca en la parte superior de la pila. De la misma manera las variables locales del m\u00e9todo, se colocan dentro de un cart\u00f3n y luego se aplia sobre las cajas de par\u00e1metros existentes. Cuando el m\u00e9todo finaliza, se remueven las cajas de variables y par\u00e1metros respectivamente.<\/p>\n<p>El mismo ciclo de vida de los elementos almacenados en la pila ocurre cuando se declaran variables dentro de par\u00e9ntesis, como por ejemplo en una sentencia <code>While<\/code>, <code>For<\/code>, etc.<\/p>\n<h3>Ejemplo 1<\/h3>\n<p>En el siguiente c\u00f3digo del programa <strong>TheStackTest1<\/strong> tipo consola, creamos tres variables:<\/p>\n<pre>namespace <strong>TheStackTest1<\/strong>\n{\n    class Program\n    {\n        static void <strong>Main<\/strong>(string[] <strong>args<\/strong>)\n        {\n            int <strong>var1<\/strong> = 20000;\n            short <strong>var2<\/strong> = 15;\n            bool <strong>var3<\/strong> = true;\n        }\n    }\n}\n<\/pre>\n<p>Mediante las ventanas <strong>Call Stack<\/strong> y <strong>Locals<\/strong> de Visual Studio podemos ver la pila:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-299 size-full\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindows.png\" alt=\"\" width=\"693\" height=\"258\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindows.png 693w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindows-300x112.png 300w\" sizes=\"(max-width: 693px) 100vw, 693px\" \/><\/p>\n<p>Como nos podemos dar cuenta, el primer elemento de la pila es el par\u00e1metro <code>args<\/code> del m\u00e9todo <code>Main<\/code>,\u00a0y el ultimo o el que se encuentra en la parte superior de la pila es la variable <code>var3<\/code>.<\/p>\n<p>Para visualizar las ventana <strong>Call Stack<\/strong> y <strong>Locals<\/strong>, debemos ir al men\u00fa <strong>Debug<\/strong>, submen\u00fa <strong>Windows<\/strong> y elegir la opci\u00f3n <strong>Call Stack <\/strong>o <strong>Locals<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-297 size-full\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindowsMenu.png\" alt=\"\" width=\"628\" height=\"698\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindowsMenu.png 628w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindowsMenu-270x300.png 270w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/CallStackWindowsMenu-378x420.png 378w\" sizes=\"(max-width: 628px) 100vw, 628px\" \/><\/p>\n<h3>Ejemplo 2<\/h3>\n<p>En el siguiente c\u00f3digo del programa <strong>TheStackTest2<\/strong> tipo consola, creamos las mismas tres variables del <strong>Ejemplo 1<\/strong>, seguido de dos m\u00e9todos m\u00e1s: <strong>Metodo1<\/strong> y <strong>Metodo2<\/strong>.<\/p>\n<pre>using System;\n\nnamespace <strong>TheStackTest2<\/strong>\n{\n    class Program\n    {\n        static void <strong>Main<\/strong>(string[] <strong>args<\/strong>)\n        {\n            int <strong>var1<\/strong> = 20000;\n            short <strong>var2<\/strong> = 15;\n            bool <strong>var3<\/strong> = true;\n\n            Metodo1(var1, var2, var3);\n        }\n\n        static void <strong>Metodo1<\/strong>(int <strong>param1<\/strong>, short <strong>param2<\/strong>, bool <strong>param3<\/strong>)\n        {\n            decimal <strong>var4<\/strong> = 5.05m;\n\n            Metodo2(var4);\n        }\n\n        static void <strong>Metodo2<\/strong>(decimal <strong>param4<\/strong>)\n        {\n            string <strong>var5<\/strong> = \"FIN\";\n\n            Console.WriteLine(var5);\n        }\n    }\n}\n<\/pre>\n<p>A continuaci\u00f3n, se muestran las pilas de cada m\u00e9todo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-312 size-full\" title=\"Pila m\u00e9todo principal.\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_1.png\" alt=\"\" width=\"871\" height=\"284\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_1.png 871w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_1-300x98.png 300w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_1-768x250.png 768w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_1-696x227.png 696w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-314 size-full\" title=\"Pila m\u00e9todo 1\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_2.png\" alt=\"Pila m\u00e9todo 1.\" width=\"870\" height=\"283\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_2.png 870w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_2-300x98.png 300w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_2-768x250.png 768w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_2-696x226.png 696w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-315 size-full\" title=\"Pila m\u00e9todo 2\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_3.png\" alt=\"Pila m\u00e9todo 2.\" width=\"870\" height=\"283\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_3.png 870w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_3-300x98.png 300w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_3-768x250.png 768w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheStackTest2_3-696x226.png 696w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/p>\n<p>Tal como se puede visualizar, al momento de llamar a un m\u00e9todo, se a\u00f1aden elementos a la pila (par\u00e1metros y variables) y una vez finalizados, se eliminan.<\/p>\n<p>En estos ejemplos hemos usado <a href=\"https:\/\/joffremoncayo.com\/blog\/tipos-de-datos-integrados-en-csharp\/\" target=\"_blank\" rel=\"noopener noreferrer\">tipos de datos predefinidos<\/a> por C#, pero y \u00bfSi quisi\u00e9ramos definir nuestras propias clases u objetos? Es aqu\u00ed donde entra en juego el <strong>Mont\u00edculo<\/strong>.<\/p>\n<h2>The Heap<\/h2>\n<p>El <strong>Mont\u00edculo<\/strong> o <strong>Mont\u00f3n<\/strong> es un \u00e1rea de memoria donde se asignan fragmentos o espacios para almacenar ciertos tipos de objetos. A diferencia de la <strong>Pila<\/strong>, los datos pueden ser agregados y removidos en cualquier orden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-331 size-full\" title=\"The Heap\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheHeap.png\" alt=\"\" width=\"556\" height=\"355\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheHeap.png 556w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/TheHeap-300x192.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/p>\n<p>Las caracter\u00edsticas generales del <strong>Mont\u00edculo<\/strong> son las siguientes:<\/p>\n<ol>\n<li>Todo objeto es almacenado en el <strong>Mont\u00f3n<\/strong>, mientras la referencia al objeto est\u00e1 en la <strong>Pila<\/strong>.<\/li>\n<li>El tama\u00f1o del <strong>Mont\u00edculo<\/strong> no es ilimitado, si al momento de crear un objeto no hay suficiente espacio, ocurrir\u00e1 una excepci\u00f3n de tipo <code>OutOfMemoryException<\/code>, y el objeto no ser\u00e1 creado.<\/li>\n<\/ol>\n<p>Si tomamos nuevamente como referencia las cajas de cart\u00f3n, en el caso del <strong>Mont\u00edculo<\/strong> dichas cajas est\u00e1n esparcidas en el piso de una habitaci\u00f3n sin un orden especifico.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-328\" src=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/MonticuloCajas.jpg\" alt=\"\" width=\"400\" height=\"400\" srcset=\"https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/MonticuloCajas.jpg 400w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/MonticuloCajas-300x300.jpg 300w, https:\/\/joffremoncayo.com\/blog\/wp-content\/uploads\/2019\/05\/MonticuloCajas-150x150.jpg 150w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Cuando un objeto es creado, el runtime busca una caja vac\u00eda del <strong>Mont\u00f3n<\/strong> de la habitaci\u00f3n y lo coloca adentro. La referencia al objeto es almacenada en una variable local en la <strong>Pila<\/strong>. El runtime mantiene una pista del n\u00famero de referencias a la caja donde se encuentra el objeto, ya que dos o m\u00e1s variables pueden hacer referencia a un mismo objeto. Cuando la \u00faltima referencia al objeto desaparece, el runtime marca la caja como vac\u00eda o en desuso, y en este punto estar\u00e1 lista para que ese espacio de memoria quede disponible y se pueda almacenar otro objeto.<\/p>\n<p>Los objetos almacenados en el <strong>Mont\u00edculo <\/strong>no pueden ser eliminados de forma expl\u00edcita. Por defecto, el <strong>Garbage Collector<\/strong> autom\u00e1ticamente limpia los objetos hu\u00e9rfanos cuando detecta que el c\u00f3digo tiene un largo periodo de tiempo sin usarlos, con la ventaja que existan menos errores de memoria.<\/p>\n<h2>Observaci\u00f3n<\/h2>\n<p>Cabe recalcar que el sistema se encarga autom\u00e1ticamente de la gesti\u00f3n de la <strong>Pila<\/strong> y el <strong>Mont\u00edculo<\/strong>. Sin embargo, como desarrolladores es importante tener los conceptos claros de c\u00f3mo funcionan estos mecanismos para la administraci\u00f3n de datos en memoria.<\/p>\n<h2>Referencias<\/h2>\n<p><a href=\"https:\/\/docs.microsoft.com\/es-es\/visualstudio\/debugger\/how-to-use-the-call-stack-window?view=vs-2019\" target=\"_blank\" rel=\"noopener noreferrer\">Ver la pila de llamadas y usar la ventana pila de llamadas del depurador<\/a><\/p>\n<p>\u00a0<\/p>","protected":false},"excerpt":{"rendered":"<p>Cuando un programa se va a ejecutar, se reserva un espacio de memoria para almacenar su entorno, as\u00ed como tambi\u00e9n los datos que va a utilizar. La cantidad de memoria que ser\u00e1 requerida, donde y como ser\u00e1 almacenada, depender\u00e1 del tipo de dato a declarar. Al momento de requerir un espacio de memoria, se puden [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/posts\/229"}],"collection":[{"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":69,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":344,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/posts\/229\/revisions\/344"}],"wp:attachment":[{"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joffremoncayo.com\/blog\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}