La norme C définit-elle la taille de std::array ?
En C 11, std::array offre un stockage contigu avec des performances comparables aux tableaux réguliers. Cependant, il n'est pas clair si la taille et la disposition de la mémoire de std::array reflètent celles des tableaux normaux.
Exigences standard
La norme C (§23.3.2.1/2) définit un tableau comme un agrégat initialisé via :
array<T, N> a = { initializer-list };
En tant qu'agrégat, std::array ne peut pas utiliser de constructeurs pour convertir les données dans la liste d'initialisation. Cela implique qu'il stocke principalement les valeurs de données réelles.
Comportement spécifique à l'implémentation potentielle
Techniquement, il est possible qu'un std::array inclue des données auxiliaires ou non. -alignement standard, qui s'écarterait du comportement normal d'un tableau.
Par exemple, un compilateur pourrait ajouter une valeur sentinelle à la fin d'un std::array pour détecter les tentatives d'écriture hors limites. Alternativement, le super-alignement (par exemple, les instructions Intel SSE) pourrait être pris en charge par un std::array mais pas par un tableau intégré.
Comportement attendu
En général, vous pouvez vous attendre à ce que le code suivant se comporte comme prévu :
std::vector< std::array<int, N> > x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer) &x[0][0]; // Use y as a multidimensional array
La plupart des compilateurs (par exemple, GNU et Intel) adhèrent à ce comportement. Cependant, il est important de noter que la norme ne garantit pas explicitement une disposition de mémoire identique pour std::array et les tableaux normaux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!