2015-01-03 1 views
-1

나는 종종 "C++ 소스는 컴파일하는데 많은 시간과 메모리가 필요합니다"라고 들었습니다.무한한 시간 동안 컴파일되는 C++ 코드가 있습니까?

또한 C++ 템플릿은 튜링이 완료된 것으로 들었으므로 Halting problem이 발생할 수 있습니다.

나는 또한 8 GiB의 메모리와 2 시간의 시간을 소비하는 C++ 프로젝트를 만들었습니다.

질문 : 무한한 시간 동안 컴파일되는 C++ 코드가 있습니까?

(중첩 포함하거나 계산해서는 안 중첩 된 템플릿을 감지 할 수 있습니다.)

관련 질문

: Is there a C++ code that compiles with infinite memory? (내가 다른 대답을 기대하기 때문에이를 분리.)

+3

사람은 알 것입니다 방법 -하지만 난 완료 될 때까지 기다릴 수있는 것 같아요 ? –

+0

이론적으로는 일반적이고 순수한 C++ 컴파일러의 컴파일에 무한한 시간이 걸리는 소스를 만들 수 있습니다. 실제 컴파일러와 현대 컴파일러? 아마 불가능합니다. –

+0

심도 한계로 인해 컴파일 시간이 유한하지만 tt는 우주 수명보다 오래 컴파일하는 프로그램을 만들기가 쉽습니다. – zch

답변

8

이론적으로이 무한 '에 대한 컴파일 것 '시간 템플릿 확장은 무한 재귀 때문에 그러나

template <size_t N> 
struct eat 
{ 
    static constexpr size_t value = eat<N+1>::value; 
}; 

, 내가 사용하는 모든 컴파일러에서 오류가 많이와 같은 발광, 이러한 종류의 코드 방어 이 :

/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: fatal error: recursive template instantiation exceeded maximum depth of 256 
    static constexpr size_t value = eat<N+1>::value; 
            ^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<257>' requested here 
    static constexpr size_t value = eat<N+1>::value; 
            ^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<256>' requested here 
    static constexpr size_t value = eat<N+1>::value; 
            ^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<255>' requested here 
    static constexpr size_t value = eat<N+1>::value; 
            ^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<254>' requested here 
    static constexpr size_t value = eat<N+1>::value; 

... 등

편집 : 확인,이 사람이 정말 무한하다고 생각 :

template <class T> 
struct eat2 
{ 
    using inner = eat2<eat2<T>>; 
    static constexpr int value() { 
     return inner::value(); 
    } 
}; 

int main() 
{ 
    eat2<int> e; 
    cout << e.value() << endl; 
    return 0; 
} 
+0

'size_t'가 한정된 값을 가지고 있기 때문에 재귀 깊이를 증가시킬지라도 무한대가되지는 않습니다. – filmor

+1

2^64 (내 컴파일러에서) 반복 후에 N이 롤오버되면 (이론적으로) 컴파일이 중지됩니다. –

+0

@filmor 일단 값이 size_t의 최대 값에 도달하면 새 템플릿 매개 변수를 추가하기 위해 해당 코드를 확장하는 것이 간단합니다. – stefan