web-dev-qa-db-fra.com

Est-ce que std :: array <> garantit l'allocation sur la pile uniquement?

Est std::array<int,10> (sans utiliser moi-même new) garanti d'être alloué dans la pile plutôt que dans le tas par le C++ - Standard?

Pour être clair, je ne veux pas dire new std::array<int, 10>. Je me demande principalement si la bibliothèque standard est autorisée à utiliser new dans son implémentation.

29
towi

Je n'ai pas pu trouver de réponse plus explicite dans la norme, mais [array.overview]/2 :

Un tableau est un agrégat ([dcl.init.aggr]) qui peut être initialisé par liste avec jusqu'à N éléments dont les types sont convertibles en T.

Et [dcl.init.aggr]/1 :

Un agrégat est un tableau ou une classe (Clause [class]) avec

  • aucun constructeur fourni par l'utilisateur , explicite ou hérité ([class.ctor]),

...

C'est à peu près tout. Aucun moyen un agrégat pourrait allouer de la mémoire de manière dynamique (ou peut-être faire quoi que ce soit à lui-même pendant la construction). Il n'y a qu'un constructeur trivial déclaré implicitement.

Bien sûr, si vous new std::array<...>, vous obtenez un tableau sur "le tas".


Certains peuvent être plus satisfaits de ce que nous pouvons faire cppreference :

std::array est un conteneur qui encapsule des tableaux de taille fixe.

Ce conteneur est un type agrégé avec la même sémantique qu'une structure contenant un tableau de style C T[N] comme seul membre de données non statique.


Troisièmement, std::array a été introduit en C++ 11. Pourquoi? Par exemple, pour compléter std::vector à certains égards, comme l'utilisation dans les fonctions constexpr, où l'allocation dynamique n'est pas autorisée.

17
LogicStuff

TL; DR: oui, c'est sur la pile.


L'histoire la plus longue:

C++ n'a aucun concept de pile ou de tas. Ce sont des détails d'implémentation, et il existe au moins une plate-forme qui n'utilise pas une pile traditionnelle (mais plutôt une liste liée d'allocations de tas pour elle).

Il a un stockage automatique et le magasin gratuit. new accède à la boutique gratuite et les variables "sur la pile" entrent dans le stockage automatique.

En pratique, pour allouer des choses sur la boutique gratuite, vous devez risquer une exception de mémoire insuffisante. Donc, la règle générale est que les choses qui garantissent qu'ils ne jettent pas doivent utiliser le stockage automatique. array fait cette garantie (sauf ce qui peut y être jeté, nativement). Il s'agit également d'un agrégat de données anciennes, forcées de ressembler à:

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 théorie, il pourrait être implémenté par le compilateur via magie qui n'est pas du C++ réel, mais cela n'est pas nécessaire, donc personne ne dérange.

Donc en conclusion: oui, std::array est sur la pile.

20