Taille de std::array dans la norme C
La spécification C 11 pour std::array garantit un stockage contigu et des performances comparables à tableaux réguliers. Cependant, cela soulève la question de savoir si std::array a la même taille et la même disposition de mémoire qu'un tableau standard.
Selon le §23.3.2.1/2 de la norme, un tableau est un agrégat qui peut être initialisé à l'aide de la syntaxe :
std::array<T, N> a = { initializer-list };
En tant qu'agrégat, std::array doit stocker directement les valeurs de la liste d'initialisation. Bien qu'il soit théoriquement possible qu'un std::array stocke des données auxiliaires ou diffère par son alignement d'un tableau normal, ces possibilités sont très improbables.
En pratique, la plupart des compilateurs traitent std::array comme un bloc contigu de mémoire avec la même taille et la même disposition qu’un tableau ordinaire. Ce comportement est pris en charge par une documentation tierce et observé dans divers compilateurs.
Par exemple, le code suivant, qui accède à un std::array en tant que pointeur de tableau multidimensionnel, fonctionne comme prévu :
std::vector<std::array<int, N>> x(M); typedef int (*ArrayPointer)[N]; ArrayPointer y = (ArrayPointer)&x[0][0]; // use y like normal multidimensional array
Sur la base de ces observations, il est généralement prudent de supposer que :
sizeof(std::array<int, N>) == sizeof(int) * N
Cependant, il est important de noter que ce comportement n'est pas strictement garanti par la norme. Les compilateurs disposent d'une certaine flexibilité dans la façon dont ils implémentent std::array, et les futures révisions de la norme pourraient modifier ce comportement.
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!