Maison > développement back-end > C++ > le corps du texte

Les tableaux statiques en C peuvent-ils être initialisés par programme au moment de la compilation ?

Susan Sarandon
Libérer: 2024-11-19 21:09:02
original
603 Les gens l'ont consulté

Can Static Arrays in C   Be Programmatically Initialized at Compile Time?

Création programmatique de tableaux statiques au moment de la compilation en C

La création de tableaux statiques au moment de la compilation en C est une technique précieuse pour optimiser les performances et garantir l’intégrité des données. Une façon de définir un tableau statique consiste à utiliser la syntaxe suivante :

const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };
Copier après la connexion

Bien que cette approche soit simple, elle nécessite de spécifier explicitement les valeurs du tableau. Pour gagner plus de flexibilité, il peut être souhaitable d'attribuer ces valeurs « par programmation » au moment de la compilation en utilisant diverses techniques de métaprogrammation.

Question 1 : Assignation de valeur programmatique

Pouvons-nous utiliser des techniques de métaprogrammation pour attribuer des valeurs de tableau "par programme" lors de la compilation time?

Réponse :

Oui, en utilisant les fonctionnalités C 0x, nous pouvons initialiser des tableaux de modèles locaux ou membres à partir d'une liste d'arguments de modèle variadique. Bien que cette approche puisse être limitée par la profondeur d'instanciation du modèle, elle peut apporter une amélioration significative de la flexibilité.

Question 2 : affectation sélective de valeurs

En supposant que toutes les valeurs de un tableau est le même à l'exception de quelques-uns, pouvons-nous attribuer sélectivement des valeurs au moment de la compilation dans un programme manière ?

Réponse :

Oui, nous pouvons utiliser une combinaison de modèles variadiques et de modèles de fonctions pour générer des tableaux avec des valeurs spécifiques. Par exemple, considérons le code suivant :

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};
Copier après la connexion

Ce code nous permet de créer des tableaux avec des valeurs spécifiques en spécifiant une fonction de modèle qui détermine la valeur à chaque index.

Exemple :

Pour créer un tableau de taille 5 avec des valeurs de 1 à 5 :

template<size_t index> struct MetaFunc { 
    enum { value = index + 1 }; 
};

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i=0; i<count; ++i) 
        std::cout << A::data[i] << "\n";
}
Copier après la connexion

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