Heim > Backend-Entwicklung > C++ > Wie kann ich die Größe eines C-Arrays zur Kompilierungszeit effizient bestimmen?

Wie kann ich die Größe eines C-Arrays zur Kompilierungszeit effizient bestimmen?

Barbara Streisand
Freigeben: 2024-11-30 08:06:16
Original
340 Leute haben es durchsucht

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

Grundlegendes zur Vorlagenfunktion „Größe des Arrays“

Dieser Code definiert eine Vorlagenfunktion, GetArrLength, die dazu dient, die Größe eines Arrays zu bestimmen:

template<typename T, int size>
int GetArrLength(T(&amp;)[size]){return size;}
Nach dem Login kopieren

Aufschlüsselung der Funktionsparameter

Der Parameter T(&)[size] wird als a deklariert Verweis auf ein Array mit der Größe size vom Typ T. Dies bedeutet, dass ein Verweis auf jedes Array akzeptiert wird, dessen Typ und Größe als Vorlagenparameter angegeben sind.

Template Parameter Matching

Beim Aufruf dieser Funktion Der Compiler versucht, die Vorlagenparameter abzuleiten. Wenn wir es beispielsweise wie folgt aufrufen:

int a[10];
GetArrLength(a);
Nach dem Login kopieren

Der Compiler stellt fest, dass T int ist und die Größe 10 beträgt, und erstellt einen Parameterverweis auf ein Array mit 10 Ganzzahlen.

Funktion Verhalten

Die Funktion gibt den Wert der Vorlagenparametergröße zurück und liefert damit effektiv die Anzahl der Elemente in der Array.

Verwendung und Einschränkungen

Dieser Code vereinfacht das Ermitteln der Array-Größe, weist jedoch einige Nachteile auf. Erstens verwendet es einen vorzeichenbehafteten Typ sowohl für den Vorlagenparameter als auch für den Rückgabewert, was problematisch ist, da Größen nicht negativ sein dürfen. Für eine robustere Lösung sollte ein vorzeichenloser Typ wie std::size_t verwendet werden.

Zweitens ist das Ergebnis dieser Funktion kein Konstantenausdruck, obwohl dies bei einer Array-Größe der Fall sein sollte. Die Auswertung konstanter Ausdrücke ist für bestimmte Optimierungen unerlässlich.

Lösung mit konstanten Ausdrücken

Ein fortgeschrittenerer Ansatz, der ein Ergebnis mit konstanten Ausdrücken liefert, umfasst die Verwendung der Typselbstprüfung und des Operators 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))
Nach dem Login kopieren

Diese Technik nutzt die Tatsache aus, dass die Größe eines Zeichenarrays seiner Elementanzahl entspricht. Der sizeof-Operator ruft die Größe des char-Arrays ab, das zur Darstellung der Vorlagenparametergröße verwendet wird, und liefert eine konstante Ausdrucksauswertung der Array-Größe.

Das obige ist der detaillierte Inhalt vonWie kann ich die Größe eines C-Arrays zur Kompilierungszeit effizient bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage