2016-06-27 25 views
5

W ramach eksperymentu właśnie skompilowałem kod, aby wygenerować std::array<uint32_t, 256> w czasie kompilacji. Same treści tabel są dość typową tabelą odnośników CRC - jedyną nową rzeczą jest użycie funkcji constexpr do obliczania wpisów w przeciwieństwie do umieszczania automatycznie generowanej magicznej tabeli bezpośrednio w kodzie źródłowym.Praktyczne ograniczenia dotyczące liczby obliczeń constexpr

W każdym razie, to ćwiczenie mnie zainteresowało: czy istnieją jakiekolwiek praktyczne ograniczenia dotyczące wielkości obliczeń, które kompilator byłby skłonny zrobić, aby ocenić funkcję lub definicję zmiennej w czasie kompilacji? na przykład coś takiego jak parametr gcc -ftemplate-depth tworząc praktyczne ograniczenia ilości metaprogramowania szablonu. (Również zastanawiać, czy nie może być praktyczne ograniczenia na długość opakowania parametr - co ograniczenia rozmiaru kompilacji std::array utworzony za pomocą std::integer_sequence pośredni obiektu).

+0

Jeśli dobrze pamiętam, tak, istnieje limit, ale ma on być o rząd wielkości większy niż rekursywny limit instancji. – MikeMB

Odpowiedz

3

Zalecenia te można znaleźć w [implimits] ¶2:

(2.35)   —   Recursive constexpr function invocations [512]

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

GCC i Clang umożliwiają regulację poprzez -fconstexpr-depth (która jest flaga szukałeś).

Ewaluacja stałego wyrażenia praktycznie działa w piaskownicy, ponieważ undefined behavior must be preempted by the implementation. Mając to na uwadze, nie rozumiem, dlaczego implementacja nie mogła wykorzystać wszystkich zasobów komputera-hosta. Z drugiej strony nie polecałbym pisania programów, których kompilacja wymaga gigabajtów pamięci lub innych nierozsądnych zasobów ...

+0

OK, czy "Argumenty szablonów w deklaracji szablonu [1 024]" również zliczają długości pakietów parametrów? (Zgaduję, że tak, w przeciwnym razie można by użyć tego limitu tylko z bardzo źle napisanym kodem C++.) Jeśli tak, to znaczy, że budowanie tabeli wyszukiwania 'std :: array ' do przetwarzania dwóch bajtów w czas prawdopodobnie nie byłby praktyczny. –

+0

@DanielSchepler Nie rozumiem. – Columbo

+0

Na końcu tabela jest tworzona przez funkcję 'template constexpr std :: array crc_table_impl (uint32_t crc_poly, std :: integer_sequence ) {return {crc_table_entry (crc_poly, I) ...}; } 'jest przekazywane' integer_sequence' zawierające od 0 do 255. Więc, jeśli spróbuję zrobić to samo z 'uint16_t', pojawi się szablon pośredni z argumentami 65537. –

Powiązane problemy