Maison > développement back-end > C++ > Comment puis-je déterminer efficacement la taille d'un tableau C au moment de la compilation ?

Comment puis-je déterminer efficacement la taille d'un tableau C au moment de la compilation ?

Barbara Streisand
Libérer: 2024-11-30 08:06:16
original
356 Les gens l'ont consulté

How Can I Efficiently Determine the Size of a C   Array at Compile Time?

Comprendre la fonction de modèle « Taille du tableau »

Ce code définit une fonction de modèle, GetArrLength, conçue pour déterminer la taille d'un tableau :

template<typename T, int size>
int GetArrLength(T(&amp;)[size]){return size;}
Copier après la connexion

Décomposition des paramètres de la fonction

Le paramètre T(&)[size] est déclaré comme référence à un tableau de taille size de type T. Cela signifie qu'il accepte une référence à tout tableau dont le type et la taille sont spécifiés comme paramètres de modèle.

Correspondance des paramètres de modèle

Lors de l'appel de ceci fonction, le compilateur tente de déduire les paramètres du modèle. Par exemple, si nous l'appelons comme suit :

int a[10];
GetArrLength(a);
Copier après la connexion

Le compilateur déterminera que T est un entier et que la taille est 10, créant une référence de paramètre à un tableau de 10 entiers.

Fonction Comportement

La fonction renvoie la valeur de la taille du paramètre du modèle, fournissant effectivement le nombre d'éléments dans le array.

Utilisation et limitations

Ce code simplifie l'obtention de la taille du tableau mais présente quelques inconvénients. Premièrement, il utilise un type signé à la fois pour le paramètre de modèle et la valeur de retour, ce qui pose problème car les tailles ne peuvent pas être négatives. Pour une solution plus robuste, un type non signé tel que std::size_t doit être utilisé.

Deuxièmement, le résultat de cette fonction n'est pas une expression constante, même si la taille d'un tableau devrait l'être. L'évaluation d'expression constante est essentielle pour certaines optimisations.

Solution d'expression constante

Une approche plus avancée qui fournit un résultat d'expression constante implique l'utilisation de l'introspection de type et de l'opérateur sizeof :

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type&amp; sizeof_array_helper(T(&amp;)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
Copier après la connexion

Cette technique exploite le fait que la taille d'un tableau de caractères est égale à son nombre d'éléments. L'opérateur sizeof récupère la taille du tableau de caractères utilisé pour représenter la taille du paramètre du modèle, fournissant une évaluation par expression constante de la taille du tableau.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal