Los rincones del API Win32: Los montones - El montón y los objetos

5 - El montón y los objetos

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Ahora vamos realizar lo mismo que antes, pero aplicando la orientación a objetos:void CrearBesugo( void ) { CBesugo *besugo; besugo = new CBesugo; besugo->Nada; delete besugo; chao pescao }

Como vemos, se define una variable (que en realidad es un objeto de una clase), se crea, se llama a un método del objeto, y se destruye.

Esto resulta familiar ¿no?. Pues sí, los objetos, al crearse dinámicamente en tiempo de ejecución, también residen en el montón. Y para acceder a ellos se hace a través de un puntero como no podía ser de otra forma.

Si hubiésemos olvidado liberar el objeto (sin hacer delete), caeríamos de nuevo en otro “goteo de memoria”.

Algún alumno aventajado puede decir lo siguiente: "y si el tamaño de la clase es conocido en tiempo de compilación ¿porqué no se almacena el objeto en la pila, como, por ejemplo, un registro o estructura?"

Bueno, esta es la pregunta del millón.

Es muy cierto que el tamaño de la clase se conoce durante la compilación, y técnicamente es posible almacenar estos objetos en la pila, sin embargo se utiliza el montón por razones de rendimiento y eficiencia. Un objeto suele ocupar bastante memoria (como mínimo la suma del tamaño de sus atributos, más un puntero a la definición de la clase), así que si definimos un par de objetos dentro una función, y estos se almacenasen en la pila, lo más probable es que esta se desbordase, ya que, como todos sabemos, el tamaño de la pila es limitado y fijo.

Por eso, en la mayoría de la ocasiones, los objetos se almacenan en el montón, ya que el tamaño del montón es mucho mayor que el de la pila.

Como habéis visto, he dicho “en la mayoría de las ocasiones” porque siempre hay una excepción. En C es posible hacer esto, aunque en otros lenguaje como Pascal el código equivalente sería imposible:

void CrearBesugo( void ) { besugo CBesugo;
ya no es puntero besugo.Nada; }

Y lo que estamos haciendo es almacenar nuestro "besugo" en la pila. Como vemos, ya no definimos una variable puntero, ni utilizamos el operador de indirección "->", sino que tratamos a nuestro besugo como si de una estructura o registro se tratara. Del mismo modo, tampoco es necesaria la creación ni destrucción del objeto, ya que es la pila la encargada de reservar su espacio al iniciar, y descartarlo al finalizar. El que no entienda el porqué de esto, le sugiero que lea el artículo de “La Pila”.

Esta técnica es bastante utilizada en programas en C++, siempre que los objetos a crear no sean demasiado grandes, ya que podrían desbordar la pila. La principal razón para el uso de esta técnica es la rapidez de ejecución (la pila es bastante más rápida que el montón) y comodidad (ya no hay que preocuparse de la creación y destrucción de los objetos). Sin embargo, para hacer esto, hay que saber bien lo que se hace (y nosotros ya estamos en condiciones de hacerlo).

Hasta ahora hemos dado una descripción bastante detallada de los usos del montón, sin embargo, toda esta información ha sido genérica, y en ningún momento nos hemos centrado en las peculiaridades de la plataforma Win32.
[editar]

2 opiniones

Estudiante.

Me pareció más que bueno.
Bueno.

Que trabajo!!!, no lo lei de manera completa, pero, si champeo, de seguro que no me equivoque al tomarme la molestia de bajarlo para estudiarlo a profundidad, gracias por el trabajo que dejas libre.

Tutoriales relacionados con 'Los rincones del API Win32: Los montones'

Curso que profundiza en el gestor de montones (o montículos) dentro de Win32, así como... Más »
Este curso trata el tema de la memoria en la plataforma Win32. En esta ocasión... Más »
Damos una visión detallada de una de las características más interesantes de esta tecnología de... Más »

Autor y licencia de 'Los rincones del API Win32: Los montones'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.