Matriz estática frente a matriz dinámica en C ++

¿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 comstackción y dynamic 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 ++?

Los arrays locales se crean en la stack 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 stack:

 int* foo = new int[10]; delete[] foo; 

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 dynamic)

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 comstackción. Esa es una pregunta más fácil, las matrices en tiempo de comstackción se determinan por adelantado (cuando se comstack el progtwig) y son parte de un marco de stack 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 progtwig deja de ejecutarse.

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 “dynamic” es “tamaño variable”. En ese caso, entonces, una matriz de tamaño constante podría verse así:

 int x[10]; 

y uno “dynamic” sería cualquier tipo de estructura que permita boost 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 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.

Las matrices estáticas se asignan a la memoria en tiempo de comstackción y la memoria se asigna en la stack. 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. 

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 scope 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 stack . 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 comstackció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 comstackdor puede usar direcciones absolutas para acceder a las matrices lo cual es imposible con el almacenamiento basado en stack.

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 .

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 ().

Sí, a la derecha, la matriz estática se crea en el momento de la comstackció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 stack 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.

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];

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]; 

parásitos de architecture estática con elementos en el lado de la matriz

dinosaurios arrarios dynamics sin dar elementos en el lado de la matriz

ejemplo:

  char a[10]; //static array char a[]; //dynamic array