2016-06-27 2 views
5

실험으로 컴파일 할 때 std::array<uint32_t, 256>을 생성하는 코드를 작성했습니다. 테이블 내용 자체는 꽤 전형적인 CRC 검색 테이블입니다. 유일한 새로운 점은 소스 코드에 자동 생성 된 마법 테이블을 직접적으로 두는 것과는 대조적으로 항목을 계산하는 기능 인 constexpr을 사용한다는 것입니다.constexpr 계산의 실제적인 제한

어쨌든,이 연습에는 궁금한 점이 있습니다. 컴파일시에 컴파일러가 constexpr 함수 또는 변수 정의를 평가하기 위해 기꺼이 수행 할 계산량에 실질적인 제한이 있습니까? 예 : gcc의 -ftemplate-depth 매개 변수가 템플릿 메타 프로그래밍 평가의 실제적인 제한을 만드는 것과 유사합니다. (매개 변수 팩의 길이에 실질적인 제한이있을 수 있다면 나 또한 궁금해 - std::integer_sequence 중간 오브젝트를 사용하여 만든 컴파일 시간 std::array의 크기를 제한합니다.)

+0

만약 내가 xorrectly 기억, 예 한계가 있지만 재귀보다 큰 규모로되어있다 인스턴스화 제한 – MikeMB

답변

3
등을위한

권장 [implimits] ¶2에서 찾을 수 있습니다 :

(2.35)   —   Recursive constexpr function invocations [512]

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

GCC와 연타는 (당신이 찾고 있던 플래그 인) -fconstexpr-depth를 통해 조정을 할 수 있습니다.

undefined behavior must be preempted by the implementation이기 때문에 상수 표현식 평가가 실제로 샌드 박스에서 실행됩니다. 이를 염두에두고 필자는 구현이 호스트 시스템의 전체 리소스를 사용할 수없는 이유를 알지 못합니다. 그럼 다시 컴파일을 메모리 또는 기타 불합리한 리소스의 기가 바이트가 필요 프로그램을 작성하지 않는 것이 좋습니다 ...

+0

OK, "템플릿 선언 [1 024]의 템플릿 인수도"매개 변수 팩의 길이를 계산합니까? (필자는 추측하고 있습니다. 그렇지 않으면 극도로 잘못 작성된 C++ 코드를 사용하여 그 한계에 부딪 힐 수 있습니다.) 그렇다면 두 개의 바이트를 처리 할'std :: array '검색 테이블을 시간은 아마도 실용적이지 않을 것입니다. –

+0

@DanielSchepler 이해가 안됩니다. – Columbo

+0

결국이 테이블은'template constexpr std :: array crc_table_impl (uint32_t crc_poly, std :: integer_sequence ...>) {return {crc_table_entry (crc_poly, I) ...}; }'0 ~ 255를 포함하는'integer_sequence'가 전달됩니다. 따라서'uint16_t'로 같은 것을하려고하면 65537 개의 인자를 가진 중간 템플릿이 생깁니다. –