multidimensional array c++ arrays stack dynamic-allocation static-allocation

multidimensional array c++



¿Std:: array<> garantiza la asignación solo en la pila? (2)

¿Está garantizado que std::array<int,10> (sin mi uso de new ) se asigne en la pila en lugar del montón de C ++ - Estándar?

Para ser claros, no me refiero a new std::array<int, 10> . Principalmente me pregunto si la biblioteca estándar puede usar new dentro de su implementación.


No pude encontrar una respuesta más explícita en el estándar, pero [array.overview]/2 :

Una matriz es un agregado ( [dcl.init.aggr] ) que se puede inicializar en lista con hasta N elementos cuyos tipos son convertibles a T

Y [dcl.init.aggr]/1 :

Un agregado es una matriz o una clase (Cláusula [class] ) con

  • no hay constructores proporcionados , explícitos o heredados por el usuario ( [class.ctor] ),

...

Eso lo cubre todo. De ninguna manera un agregado podría asignar memoria dinámicamente (o tal vez, hacer algo en absoluto durante la construcción). Solo hay un constructor trivial declarado implícitamente.

Por supuesto, si es new std::array<...> , obtendrá una matriz en "el montón".

Algunos pueden estar más satisfechos con lo que podemos obtener en cppreference :

std::array es un contenedor que encapsula matrices de tamaño fijo.

Este contenedor es un tipo agregado con la misma semántica que una estructura que contiene una matriz de estilo C T[N] como su único miembro de datos no estáticos.

En tercer lugar, std::array se introdujo en C ++ 11. ¿Por qué? Por ejemplo, para complementar std::vector de alguna manera, como el uso en constexpr funciones constexpr , donde no se permite la asignación dinámica.


TL; DR: sí, está en la pila.

La historia más larga:

C ++ no tiene ningún concepto de pila o pila. Esos son detalles de implementación, y hay al menos una plataforma que no usa una pila tradicional (sino una lista vinculada de asignaciones de almacenamiento dinámico para ella).

Cuenta con almacenamiento automático y la tienda gratuita. new accesos a la tienda gratuita y las variables "en la pila" se almacenan automáticamente.

En la práctica, para poder asignar cosas en la tienda gratuita, debe arriesgarse a una excepción de memoria insuficiente. Así que la regla general es que las cosas que garantizan que no tiren deben estar usando almacenamiento automático. array hace esta garantía (excepto lo que está en ella puede lanzar, naturalmente). También es un agregado de datos antiguos, obligados a parecerse a:

template<class T,std::size_t N> struct array { T __no_fixed_name__[N]; // non-constructor/destructor methods omitted as they are noise at this point };

En teoría, podría ser implementado por el compilador a través de la magia que no es C ++ real, pero no hay necesidad de eso, por lo que nadie se molesta.

En conclusión: sí, std::array está en la pila.