Por qué los programadores necesitan punteros en lugar de matrices fijas

15

Quieres construir un editor de texto. Tal vez sea un reemplazo moderno de Vi o una nueva versión del Bloc de notas. No importa. El objetivo es simple: permitir a los usuarios editar archivos ASCII estándar.

Piense en la frecuencia con la que los programadores utilizan estas herramientas. Es su interfaz principal con la máquina. Es donde los pensamientos se convierten en código. Naturalmente, quieres que se sienta bien. Quieres que sea rápido. Quiere que maneje su flujo de trabajo específico. Entonces, decides construir el tuyo propio.

El primer obstáculo es la estructura de datos. ¿Cómo se almacena el texto en la memoria? Necesitas una forma de manipular a los personajes rápidamente. ¿Tu instinto inicial? Líneas de texto.

Tomas una matriz. Bastante simple. Una línea típica tiene 80 caracteres. Un archivo típico tiene quizás 1000 líneas. Declaras una matriz bidimensional:

Son 80.000 caracteres. Manejable. Limpio.

Pero entonces llega la realidad. Piensas en casos extremos.

Algunos archivos son listas de registros masivas. Miles de líneas, cada una de apenas 10 caracteres.

Otros archivos son volcados de datos para fines especiales. Una línea puede contener 542 caracteres que representan pares de aminoácidos en una secuencia de ADN.

Y los editores modernos te permiten abrir varios archivos simultáneamente. Digamos que lo limita a 10 archivos abiertos. Establece un límite estricto de 1.000 caracteres por línea y 50.000 líneas por archivo.

Ahora su declaración se ve así:

Tú haces los números. 50.000 veces 1.000 veces 10. Eso son 500 millones de caracteres.

La mayoría de las computadoras no pueden manejar eso. Incluso con la memoria virtual, es una carga. Ejecute tres instancias de su editor en un sistema multiusuario y estará ahogando la RAM. Es un desperdicio extravagante. Está asignando espacio para el peor de los casos, cuando la mayoría de los usuarios solo están editando archivos de 100 líneas que ocupan 4000 bytes.

El problema con las matrices es rígido. Debes declarar el tamaño máximo en cada dimensión por adelantado. Esas dimensiones se multiplican. ¿Y si alguien intenta abrir un archivo con una línea de 2000 caracteres? No tienes suerte. La longitud de la línea es técnicamente infinita. No puedes predecirlo.

Por eso existen los punteros.

Cómo los punteros resuelven el desperdicio de memoria

Los punteros le permiten construir estructuras de datos dinámicas. En lugar de reservar espacio estático por adelantado, asigna memoria del montón mientras se ejecuta el programa.

Utiliza la cantidad exacta de memoria que necesita el documento. Sin desperdicio. Cuando cierras un archivo, devuelves esa memoria al montón. Otras partes del programa pueden usarlo. La memoria se recicla.

No se trata sólo de ahorrar espacio. Se trata de flexibilidad. No es necesario adivinar la longitud máxima de la línea. Usted asigna lo que necesita, cuando lo necesita.

Si todavía te preguntas qué es realmente un byte, o cómo se traducen “mega” y “giga” en restricciones del mundo real, lee sobre bits y bytes. Entonces regresa. Deberá comprender los límites del hardware para comprender por qué fallan aquí los arreglos estáticos.