llenar - Matriz estática frente a matriz dinámica en C++
matriz dinamica c++ (10)
Arreglo estático: Eficiencia. No se requiere asignación dinámica o desasignación.
Las matrices declaradas en C, C ++ en función, incluido el modificador estático, son estáticas. Ejemplo: static int foo [5];
¿Cuál es la diferencia entre una matriz estática y una matriz dinámica en C ++?
Tengo que hacer una tarea para mi clase y dice no usar matrices estáticas, solo matrices dinámicas. He buscado en el libro y en línea, pero parece que no entiendo.
Pensé que static se creó en tiempo de compilación y dinámico en tiempo de ejecución, pero podría confundir esto con la asignación de memoria.
¿Puedes explicar la diferencia entre la matriz estática y la matriz dinámica en C ++?
Creo que en este contexto significa que es estático en el sentido de que el tamaño es fijo. Use std :: vector. Tiene una función de cambio de tamaño ().
Creo que la semántica que se usa en tu clase es confusa. Lo que probablemente significa "estático" es simplemente "tamaño constante", y lo que probablemente se entiende por "dinámico" es "tamaño variable". En ese caso, entonces, una matriz de tamaño constante podría verse así:
int x[10];
y uno "dinámico" sería cualquier tipo de estructura que permita aumentar o disminuir el almacenamiento subyacente en tiempo de ejecución. La mayoría de las veces, la clase std::vector
de la biblioteca estándar de C ++ será suficiente. Úselo así:
std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
std::vector
tiene operator[]
definido, por lo que puede usarlo con la misma semántica que una matriz.
Es importante tener definiciones claras de lo que significan los términos. Desafortunadamente, parece haber múltiples definiciones de lo que significan las matrices estáticas y dinámicas.
Las variables estáticas son variables definidas usando la asignación de memoria estática . Este es un concepto general independiente de C / C ++. En C / C ++ podemos crear variables estáticas con alcance global, de archivo o local como este:
int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
static int z[10]; //static array with local scope
Las variables automáticas se implementan generalmente utilizando la asignación de memoria basada en la pila . Se puede crear una matriz automática en C / C ++ de esta manera:
foo() {
int w[10]; //automatic array
Lo que estas matrices, x, y, z
y w
tienen en común es que el tamaño de cada una de ellas es fijo y se define en tiempo de compilación.
Una de las razones por las que es importante entender la distinción entre una matriz automática y una matriz estática es que el almacenamiento estático generalmente se implementa en la sección de datos (o sección BSS ) de un archivo objeto y el compilador puede usar direcciones absolutas para acceder a las matrices lo cual es imposible con el almacenamiento basado en pila.
Lo que generalmente se entiende por una matriz dinámica no es uno que se puede cambiar de tamaño, sino que se implementa utilizando una asignación de memoria dinámica con un tamaño fijo determinado en tiempo de ejecución. En C ++ esto se hace usando el new
operador .
foo() {
int *d = new int[n]; //dynamically allocated array with size n
Pero es posible crear una matriz automática con un tamaño de arreglo definido en tiempo de ejecución utilizando alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
Para una verdadera matriz dinámica uno debe usar algo como std::vector
en C ++ (o una matriz de longitud variable en C ).
¿Qué significaba para la tarea en la pregunta del OP? Creo que está claro que lo que se quería no era una matriz estática o automática, sino una que utilizaba la asignación de memoria dinámica utilizando el new
operador o una matriz de tamaño no fijo usando, por ejemplo, std::vector
.
Las matrices estáticas se asignan a la memoria en tiempo de compilación y la memoria se asigna en la pila. Mientras que las matrices dinámicas tienen memoria asignada en el tiempo de ejecución y la memoria se asigna desde el montón.
int arr[] = { 1, 3, 4 }; // static integer array.
int* arr = new int[3]; // dynamic integer array.
Los arrays locales se crean en la pila y tienen una duración de almacenamiento automática: no es necesario que administres memoria manualmente, pero se destruyen cuando finaliza la función en la que están. Ellos necesariamente tienen un tamaño fijo:
int foo[10];
Las matrices creadas con el operator new[]
tienen una duración de almacenamiento dinámica y se almacenan en el montón (técnicamente la "tienda gratuita"). Pueden tener cualquier tamaño, pero debes asignarlos y liberarlos tú mismo, ya que no forman parte del marco de pila:
int* foo = new int[10];
delete[] foo;
Podría tener una matriz pseudo dinámica donde el usuario establezca el tamaño en el tiempo de ejecución, pero luego se arregla después de eso.
int size;
cin >> size;
int dynamicArray[size];
Sí, a la derecha, la matriz estática se crea en el momento de la compilación, cuando la matriz dinámica se crea en el tiempo de ejecución. Donde, como la diferencia en lo que respecta a sus ubicaciones de memoria, las estáticas se ubican en la pila y las dinámicas se crean en el montón. Todo lo que se ubica en el montón necesita la administración de la memoria hasta y a menos que el recolector de basura como en el caso de .NET Framework esté presente, de lo contrario existe el riesgo de pérdida de memoria.
parásitos de arquitectura estática con elementos en el lado de la matriz
dinosaurios arrarios dinámicos sin dar elementos en el lado de la matriz
ejemplo:
char a[10]; //static array
char a[]; //dynamic array
static es una palabra clave en C y C ++, por lo tanto, en lugar de un término descriptivo general, static tiene un significado muy específico cuando se aplica a una variable o matriz. Para complicar la confusión, tiene tres significados distintos dentro de contextos separados. Debido a esto, una matriz estática puede ser fija o dinámica.
Dejame explicar:
El primero es específico de C ++:
- Un miembro de clase estático es un valor que no se crea una instancia con el constructor o se elimina con el destructor. Esto significa que el miembro debe inicializarse y mantenerse de otra manera. El miembro estático puede ser punteros inicializados a nulo y luego asignados la primera vez que se llama a un constructor. (Sí, eso sería estático y dinámico)
Dos son heredados de C:
dentro de una función, una variable estática es aquella cuya ubicación de memoria se conserva entre las llamadas a funciones. Es estático en el sentido de que se inicializa solo una vez y conserva su valor entre las llamadas a funciones (el uso de estática hace que una función no sea reentrante, es decir, no sea segura para el hilo)
las variables estáticas declaradas fuera de las funciones son variables globales a las que solo se puede acceder desde el mismo módulo (archivo de código fuente con cualquier otro # include)
La pregunta (creo) que quisiste preguntar es cuál es la diferencia entre las matrices dinámicas y las matrices fijas o en tiempo de compilación. Esa es una pregunta más fácil, las matrices en tiempo de compilación se determinan por adelantado (cuando se compila el programa) y son parte de un marco de pila de funciones. Se asignan antes de que se ejecute la función principal. las matrices dinámicas se asignan en tiempo de ejecución con la palabra clave "new" (o la familia malloc de C) y su tamaño no se conoce de antemano. Las asignaciones dinámicas no se limpian automáticamente hasta que el programa deja de ejecutarse.