Los recursos son siempre una prima. Nos hemos esforzado por lograr una mejor utilización de los recursos en todo momento; esa es la premisa de nuestro progreso. Relacionado con esta búsqueda, está el concepto de asignación de memoria.
La memoria debe asignarse a las variables que creamos, de modo que las variables reales puedan cobrar existencia. Ahora bien, hay una restricción en cuanto a cómo pensamos que sucede y cómo sucede realmente.
¿Cómo crea la computadora una variable?
Cuando pensamos en crear algo, pensamos en crear algo desde cero, mientras que esto no es lo que realmente sucede cuando una computadora crea una variable ‘X’; a la computadora, es más como una asignación, la computadora solo asigna una celda de memoria de muchas celdas de memoria preexistentes a X. Es como si alguien llamado ‘RAJESH’ fuera asignado a una habitación de hotel de muchas celdas pre -habitaciones existentes. Este ejemplo probablemente dejó muy claro cómo la computadora hace la asignación de memoria.
Ahora, ¿qué es la asignación de memoria estática?? Cuando declaramos variables, en realidad estamos preparando todas las variables que se usarán, para que el compilador sepa que la variable que se usa es en realidad una parte importante del programa que el usuario quiere y no solo un símbolo falso que flota. Entonces, cuando declaramos variables, lo que el compilador realmente hace es asignar esas variables a sus habitaciones (consulte la analogía del hotel anterior). Ahora, si ve que esto se hace antes de que se ejecute el programa, no puede asignar variables mediante este método mientras se ejecuta el programa.
CPP
// All the variables in below program // are statically allocated. void fun() { int a; } int main() { int b; int c[10] }
¿Por qué necesitamos introducir otro método de asignación si esto solo hace el trabajo? ¿Por qué tendríamos que asignar memoria mientras se ejecuta el programa? Porque, aunque no es evidentemente visible, no poder asignar memoria durante el tiempo de ejecución impide la flexibilidad y compromete la eficiencia del espacio. Especialmente, aquellos casos en los que la entrada no se conoce de antemano, sufrimos en términos de uso de almacenamiento ineficiente y falta o exceso de ranuras para ingresar datos (dada una array o estructuras de datos similares para almacenar entradas). Entonces, aquí definimos la Asignación dinámica de memoria: el mecanismo por el cual el almacenamiento/memoria/celdas se pueden asignar a las variables durante el tiempo de ejecución se llama Asignación dinámica de memoria (que no debe confundirse con DMA ).Entonces, como hemos estado revisando todo, podemos decir que asigna la memoria durante el tiempo de ejecución, lo que nos permite usar tanto almacenamiento como queramos, sin preocuparnos por el desperdicio.
La asignación de memoria dinámica es el proceso de asignación del espacio de memoria durante el tiempo de ejecución o el tiempo de ejecución.
Razones y ventajas de asignar memoria dinámicamente:
- Cuando no sabemos de antemano cuánta cantidad de memoria se necesitaría para el programa.
- Cuando queremos estructuras de datos sin ningún límite superior de espacio de memoria.
- Cuando desee utilizar su espacio de memoria de manera más eficiente. Ejemplo: si ha asignado espacio de memoria para una array 1D como array [20] y termina usando solo 10 espacios de memoria, los 10 espacios de memoria restantes se desperdiciarán y esta memoria desperdiciada ni siquiera podrá ser utilizada por otras variables del programa.
- Las inserciones y eliminaciones de listas creadas dinámicamente se pueden hacer muy fácilmente simplemente mediante la manipulación de direcciones, mientras que en el caso de las inserciones y eliminaciones de memoria asignada estáticamente conducen a más movimientos y desperdicio de memoria.
- Cuando desee utilizar el concepto de estructuras y listas vinculadas en la programación, la asignación de memoria dinámica es imprescindible.
CPP
int main() { // Below variables are allocated memory // dynamically. int *ptr1 = new int; int *ptr2 = new int[10]; // Dynamically allocated memory is // deallocated delete ptr1; delete [] ptr2; }
Hay dos tipos de memorias disponibles: pila y montón. La asignación de memoria estática solo se puede realizar en la pila, mientras que la asignación de memoria dinámica se puede realizar tanto en la pila como en el montón. Un ejemplo de asignación dinámica que se realiza en la pila es la recursividad, donde las funciones se colocan en la pila de llamadas en orden de aparición y se eliminan una por una al llegar al caso base. Ejemplo de asignación de memoria dinámica en el montón es:
CPP
int main() { // Below variables are allocated memory // dynamically on heap. int *ptr1 = new int; int *ptr2 = new int[10]; // Dynamically allocated memory is // deallocated delete ptr1; delete [] ptr2; }
Mientras asignamos memoria en el montón, debemos eliminar la memoria manualmente, ya que el compilador no libera (desasigna) la memoria, incluso si el alcance de la memoria asignada finaliza (como en el caso de la pila).
Para concluir el tema anterior, la memoria estática es algo que el compilador asigna por adelantado. Mientras que la memoria dinámica es algo que es controlado por el programa durante la ejecución. El programa puede pedir más o puede eliminar algunos asignados.
Publicación traducida automáticamente
Artículo escrito por Nishant Chauhan 3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA