En lenguajes como C y C ++, ¿por qué las matrices tienen que ser de tamaño constante?

Sí, las matrices son de tamaño constante. El por qué se debe a lo que realmente significa una matriz.

Cuando especifica una matriz, en realidad le está diciendo a la máquina que asigne bytes consecutivos de memoria, suficiente para almacenar N elementos como el tamaño de la matriz.

Por ejemplo:

Con una matriz de 10 enteros, le indica a la máquina que asigne una porción consecutiva de bytes de memoria del montón, 10 veces el tamaño de un entero (4 bytes) , por lo que se reservan 40 bytes de memoria.

El puntero a la dirección de memoria donde comienza esa matriz se almacena (digamos la dirección 0x0000000). Cuando usa algo como matriz [1], en realidad le está diciendo a la máquina que acceda a los bytes almacenados en la ubicación de la memoria donde comienza la memoria de la matriz, con un desplazamiento de 1 (el uno es porque estamos buscando la matriz [1] ]).

Entonces array [1] sería algo así como:
0x0000000 dirección de memoria más 1, multiplicado por 4 bytes. Esto le dice a leer los 4 bytes (1 int = 4 bytes) a partir de 0x0000004.

Para que esta aritmética funcione realmente, necesita que todos los bytes sean consecutivos, sus elementos de matriz no se pueden almacenar aleatoriamente en la memoria.

Es por eso que debe especificar un tamaño de matriz en el momento en que lo instale con una operación ‘Nueva’. La máquina realmente necesita saber qué tan grande de un trozo de memoria consecutiva se asignará a la matriz.

Las matrices en C ++ tienen un tamaño constante que forma parte del tipo de matriz. Como C ++ tiene un sistema de tipo estático, el tamaño de la matriz no puede cambiar porque su tipo no puede cambiar. Sería como cambiar el número de bytes en un int.

C tiene dos tipos de matrices, una es igual que en C ++, tiene un tamaño que forma parte del tipo de matriz; otra es de “longitud variable”, con un tamaño fijo en la construcción y sin cambios durante el resto de su vida útil. . C ++ es más estricto sobre la seguridad de los tipos y, por lo tanto, nunca descubrió cómo adoptar eso (entonces, por supuesto, C ++ tiene vectores y las personas que realmente lo necesitan pueden hacer que usen stack en lugar de montón)

¿Las matrices dinámicas son inferiores en rendimiento a las matrices tradicionales?

Si te refieres a matrices creadas en el montón por el std :: vector predeterminado o con un nuevo [], solo se puede acceder a ellas indirectamente, a través de un puntero. A veces, eso significa una carga de memoria adicional, y hay menos optimizaciones disponibles, una vez más, porque el sistema de tipos no conoce el tamaño.

Nada impide que un programador de C / C ++ declare una matriz de tamaño no especificado, para eso sirve un puntero. Si no conoce el tamaño exacto de la matriz de antemano, debe declararlo como un puntero y luego a través de malloc()/calloc()/realloc() o new asignarle la memoria requerida desde el montón o desde la pila ( a través de alloca() ).

Sin embargo, si declara una matriz, el compilador debe asegurarse de la contigüidad de la memoria asignada. Para hacer eso, debe conocer su tamaño para poder diseñar adecuadamente las variables que le siguen en la pila o en el BSS, dependiendo de si la variable de matriz se declara localmente, globalmente o estáticamente. Si el tamaño no se proporciona durante la declaración de la matriz, el compilador puede asumir un tamaño predeterminado y continuar colocando otras variables después de él. Una vez que se presenta la memoria, no se puede cambiar más tarde.

More Interesting

¿Cuál es el mejor algoritmo de extracción de características para comparar dos imágenes?

Cómo encontrar las rutas que cubren todos los vértices dados (también se conocen el vértice inicial y final) en un gráfico cuyos bordes tienen peso y dirección

¿Cuándo podrán los algoritmos de detección de imágenes filtrar imágenes ofensivas de manera confiable?

¿Alguien puede dar un ejemplo en Java de pasar una matriz unidimensional, una matriz bidimensional y una matriz tridimensional por referencia y luego manipularlos?

¿Cómo funciona 'Un algoritmo neuronal de estilo artístico'?

¿Son los gráficos la mejor estructura de datos para representar circuitos? ¿Hay algo mejor?

¿Por qué una clasificación rápida es mejor que una clasificación múltiple?

¿Estudiar algoritmos mejorará mis habilidades cotidianas de toma de decisiones / resolución de problemas?

¿Por qué es Introducción a los algoritmos una lectura obligada para convertirse en un mejor programador?

Cómo equilibrar el tiempo entre el desarrollo web de aprendizaje (JavaScript) y las estructuras de datos de algoritmos

Cómo elegir un elemento único de una lista dentro de un bucle en R

Cómo escribir una matriz de distancia para el algoritmo Bellman Ford

¿Cómo manejan los sistemas de reputación los sesgos (sistémicos) que pueden distorsionar significativamente las clasificaciones basadas en tales sistemas?

¿Es una burbuja una forma muy lenta de ordenar los elementos en comparación con los otros tipos? En caso afirmativo, ¿por qué?

¿Cuándo la piratería se convirtió en algo malo? Pensé que hackear era una forma inteligente / ingeniosa de desarrollar un algoritmo para resolver un problema.