La taille de std::array est-elle imposée par la norme ?
En C 11, std::array est garanti d'avoir des éléments contigus stockage et des performances qui surpassent ou égalent une baie ordinaire. Cependant, la question demeure : la norme définit-elle explicitement la taille et la disposition de la mémoire de std::array ?
Exploration des exigences de la norme
La norme définit std :: tableau en tant qu'agrégat pouvant être initialisé à l'aide de la syntaxe :
std::array<T, N> a = { initializer-list };
En tant qu'agrégat, std::array ne peut pas employer de constructeurs pour convertir les données de la liste d'initialisation. Cela implique que le tableau stocke principalement les valeurs elles-mêmes.
Écarts possibles par rapport au comportement attendu
Techniquement, la norme n'interdit pas certains écarts potentiels :
Compilateur Variations
Malgré l'ambiguïté de la norme, son utilisation pratique dans les principaux compilateurs comme GNU et Intel suggère que la taille et la disposition de la mémoire de std::array reflètent celles des tableaux normaux.
std::vector< std::array<int, N> > x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer) &x[0][0]; // Safe multidimensional array-like usage
C'est Il est essentiel de noter que même si ce code fonctionne comme prévu, cela ne garantit pas que toutes les implémentations suivront ce modèle. Par conséquent, il n'est pas conseillé de s'appuyer sur ce comportement dans le code critique.
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!