Heim  >  Artikel  >  Backend-Entwicklung  >  Können statische Arrays in C zur Kompilierungszeit programmgesteuert initialisiert werden?

Können statische Arrays in C zur Kompilierungszeit programmgesteuert initialisiert werden?

Susan Sarandon
Susan SarandonOriginal
2024-11-19 21:09:02592Durchsuche

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

Programmatische Erstellung statischer Arrays zur Kompilierungszeit in C

Die Erstellung statischer Arrays zur Kompilierungszeit in C ist eine wertvolle Technik zur Optimierung der Leistung und Gewährleistung der Datenintegrität. Eine Möglichkeit, ein statisches Array zu definieren, ist die folgende Syntax:

const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };

Dieser Ansatz ist zwar unkompliziert, erfordert jedoch die explizite Angabe der Array-Werte. Um mehr Flexibilität zu gewinnen, kann es wünschenswert sein, diese Werte zur Kompilierungszeit mithilfe verschiedener Metaprogrammierungstechniken „programmgesteuert“ zuzuweisen.

Frage 1: Programmatische Wertezuweisung

Können wir? Verwenden Sie Metaprogrammierungstechniken, um Array-Werte beim Kompilieren „programmgesteuert“ zuzuweisen Zeit?

Antwort:

Ja, mit C 0x-Funktionen können wir lokale oder Member-Arrays von Vorlagen aus einer variadischen Vorlagenargumentliste initialisieren. Auch wenn dieser Ansatz möglicherweise durch die Instanziierungstiefe der Vorlage begrenzt ist, kann er eine deutliche Verbesserung der Flexibilität bieten.

Frage 2: Selektive Wertzuweisung

Angenommen, dass alle Werte in Wenn die Daten eines Arrays bis auf einige wenige identisch sind, können wir bei der Kompilierung in einem Programm selektiv Werte zuweisen Art und Weise?

Antwort:

Ja, wir können eine Kombination aus Variadic-Vorlagen und Funktionsvorlagen verwenden, um Arrays mit bestimmten Werten zu generieren. Betrachten Sie beispielsweise den folgenden Code:

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;
};

Mit diesem Code können wir Arrays mit bestimmten Werten erstellen, indem wir eine Vorlagenfunktion angeben, die den Wert an jedem Index bestimmt.

Beispiel :

So erstellen Sie ein Array der Größe 5 mit den Werten 1 bis 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";
}

Das obige ist der detaillierte Inhalt vonKönnen statische Arrays in C zur Kompilierungszeit programmgesteuert initialisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn