Considérez l'extrait de code suivant:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Évidemment, cela planterait sur la plupart des plates-formes, car la taille de pile par défaut est généralement inférieure à 20 Mo.
Considérez maintenant le code suivant:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Étonnamment, il se bloque également! Le traceback (avec l'une des versions récentes de libstdc ++) mène au include/bits/stl_uninitialized.h
fichier, où nous pouvons voir les lignes suivantes:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Le vector
constructeur de redimensionnement doit initialiser par défaut les éléments, et c'est ainsi qu'il est implémenté. De toute évidence, _ValueType()
temporaire bloque la pile.
La question est de savoir s'il s'agit d'une implémentation conforme. Si oui, cela signifie en fait que l'utilisation d'un vecteur de types énormes est assez limitée, n'est-ce pas?
std::allocator
est utilisée.