2016-06-27 4 views
5

Als ein Experiment, ich nur einige Code zusammen, um eine std::array<uint32_t, 256> zur Kompilierzeit zu erzeugen. Der Tabelleninhalt selbst ist eine ziemlich typische CRC-Nachschlagetabelle - über die einzige neue Sache ist die Verwendung von constexpr Funktionen, um die Einträge zu berechnen, anstatt eine automatisch erzeugte magische Tabelle direkt in den Quellcode zu setzen.Praktische Einschränkungen für die Menge der consExpr Berechnung

Wie auch immer, diese Übung hat mich neugierig gemacht: Gibt es irgendwelche praktischen Einschränkungen in Bezug auf die Menge an Berechnungen, die ein Compiler machen würde, um eine constexpr Funktion oder eine Variablendefinition zur Kompilierzeit auszuwerten? z.B. etwas wie gcc -ftemplate-depth Parameter schafft praktische Grenzen für die Menge der Vorlage Metaprogrammierung Auswertung. (Ich frage mich auch, ob es praktische Grenzen sein könnte auf die Länge eines Parameters Pack -, die die Größe eines Compile-Zeit begrenzen würde std::array erstellt ein std::integer_sequence Zwischen Objekt.)

+0

Wenn ich mich recht erinnere, ja, es gibt ein Limit, aber es soll Größenordnungen größer als das rekursive sein Instanziierungsgrenze. – MikeMB

Antwort

3

Empfehlungen für eine solche in [implimits] ¶2 zu finden:

(2.35)   —   Recursive constexpr function invocations [512]

(2.36)   —   Full-expressions evaluated within a core constant expression [1 048 576]

GCC und Clang ermöglichen die Anpassung über -fconstexpr-depth (die das Flag Sie suchen).

Konstante Ausdruck Auswertung läuft praktisch in einer Sandbox, weil undefined behavior must be preempted by the implementation. In diesem Sinne sehe ich nicht, warum die Implementierung nicht die gesamten Ressourcen des Host-Rechners nutzen konnte. Andererseits würde ich nicht empfehlen, Programme zu schreiben, deren Kompilierung Gigabytes Speicher oder andere unvernünftige Ressourcen benötigt ...

+0

OK, würde "Template arguments in einer Template-Deklaration [1 024]" auch Längen von Parameterpaketen zählen? (Ich denke ja, sonst könnte man nur mit extrem schlecht geschriebenem C++ - Code auf dieses Limit stoßen.) Wenn ja, würde das bedeuten, eine 'std :: array ' Nachschlagetabelle zu erstellen, um zwei Bytes zu verarbeiten Eine Zeit wäre wahrscheinlich nicht praktisch. –

+0

@DanielSschepler Ich verstehe es nicht. – Columbo

+0

Am Ende wird die Tabelle durch die Funktion 'template erzeugt. ConsExpr std :: array crc_table_impl (uint32_t crc_poly, std :: integer_sequence ) {return {crc_table_entry (crc_poly, I) ...}; } 'übergeben eine 'integer_sequence' mit 0 bis 255. Also, wenn ich versuchte, das gleiche mit' uint16_t' zu tun, würde es eine Zwischenvorlage mit 65537 Argumenten geben. –

Verwandte Themen