2016-06-27 20 views
5

Bir deneme olarak, derleme zamanında bir std::array<uint32_t, 256> oluşturmak için bazı kodları bir araya getirdim. Tablo içerikleri kendileri oldukça tipik bir CRC arama tablosudur - sadece yeni bir şey hakkında, otomatik olarak bir sihirli tabloyu doğrudan kaynak koduna koymak yerine, girdileri hesaplamak için constexpr işlevlerinin kullanılmasıdır.Constexpr hesaplaması miktarıyla ilgili pratik sınırlamalar

Her neyse, bu alıştırma beni meraklandırdı: bir derleyicinin derleme zamanında bir constexpr işlevini veya değişken tanımını değerlendirmek için yapmaya istekli olduğu hesaplama miktarı üzerinde herhangi bir pratik sınırlama var mıdır? Örneğin. şablon metaprogramlama değerlendirme miktarına pratik sınırlar yaratan gcc -ftemplate-depth parametresi gibi bir şey. (Parametre paketin uzunluğu ile ilgili pratik sınırlama olabilir eğer de merak - bir std::integer_sequence ara nesne kullanılarak oluşturulan bir derleme zamanında std::array boyutunu sınırlar.)

+0

Eğer xorrectly hatırlarsam, evet bir sınır var, ama bu yinelemeden daha büyük bir büyüklükte olması gerekiyordu örnekleme sınırı. – MikeMB

cevap

3
bu için

Tavsiyeler [implimits] ¶2 bulunabilir:

(2.35)   —   Recursive constexpr function invocations [512]

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

GCC ve Clang (aradığınız bayrağı olan) -fconstexpr-depth aracılığıyla vermeyi hedeflemiştir.

Sabit ifade değerlendirmesi, bir kum havuzunda çalışır, çünkü undefined behavior must be preempted by the implementation. Bunu akılda tutarak, uygulamanın neden ana makinenin tüm kaynaklarını kullanamadığını anlamıyorum. Daha sonra, derleme, bellek veya diğer mantıksız kaynakları gigabayt gerektiren programlar yazma tavsiye etmem ...

+0

Tamam, "Şablon bildirimlerinde [1 024] şablon bağımsız değişkenleri" de parametre paketlerinin uzunlukları sayılır mı? (Evet, sanırım, aksi takdirde son derece kötü yazılmış C++ koduyla sadece bu sınıra erişebilirsiniz.) Eğer öyleyse, bu, bir std :: array 'arama masasında iki bayt işlemek için bir zaman muhtemelen pratik olmaz. –

+0

@DanielSchepler Anlamıyorum. – Columbo

+0

Sonunda, tablo bir işlev 'template Constexpr std :: array crc_table_impl (uint32_t crc_poly, std :: integer_sequence ) {return {crc_table_entry (crc_poly, I) ...}; } '0'dan 255'e kadar bir 'integer_sequence' iletildi. Yani, 'uint16_t' ile aynı şeyi yapmaya çalışırsam 65537 argümanıyla bir ara şablon olurdu. –