C 14에서는 정수_sequence 클래스 템플릿 생성을 단순화하기 위해 make_integer_sequence 별칭 템플릿이 도입되었습니다. make_integer_sequence를 구현하기 위해 도우미 구조인 make_helper가 사용됩니다.
template< class T, T... I> struct integer_sequence { typedef T value_type; static constexpr size_t size() noexcept { return sizeof...(I) ; } }; template< class T, T N> using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
여기서 문제가 발생합니다. 구현에서 make_helper 구조는 재귀적 접근 방식을 사용합니다. 이는 간단한 해결책처럼 보일 수 있지만, 특히 N 매개변수가 큰 경우 템플릿 인스턴스화의 급격한 증가로 이어질 수 있습니다.
template< class T, T N, T... I > struct make_helper { typedef typename mpl::if_< T(0) == N, mpl::identity< integer_sequence<T,I...> >, make_helper< T, N-1, N-1,I...> >::type; };
이러한 기하급수적인 증가로 인해 컴파일러는 가상 메모리를 빠르게 소모할 수 있습니다. , 4의 배수로 정수 시퀀스를 생성하기 위해 GEN 매크로를 변경할 때 발생했던 것과 같습니다.
로그 깊이 구현을 사용하면 메모리 고갈 문제를 해결할 수 있습니다. 이 접근 방식은 재귀 호출 수를 최소화하여 템플릿 인스턴스화 깊이를 줄입니다.
template<unsigned...> struct seq{ using type = seq; }; template<class S1, class S2> struct concat; template<unsigned... I1, unsigned... I2> struct concat<seq<I1...>, seq<I2...>> : seq<I1..., (sizeof...(I1)+I2)...>{}; template<class S1, class S2> using Concat = Invoke<concat<S1, S2>>; template<unsigned N> struct gen_seq; template<unsigned N> using GenSeq = Invoke<gen_seq<N>>; template<unsigned N> struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{}; template<> struct gen_seq<0> : seq<>{}; template<> struct gen_seq<1> : seq<0>{};
이 대수 깊이 구현에서 재귀 깊이는 N에 따라 대수적으로 증가합니다. 이를 통해 메모리 소비가 크게 줄어들고 다음과 같은 컴파일이 가능해집니다. 훨씬 더 큰 N 값을 갖는 정수 시퀀스.
대수 깊이 구현을 사용하면 가상 메모리 소모라는 원래 문제가 해결되어 N의 값이 큰 정수 시퀀스를 생성합니다.
위 내용은 메모리 고갈을 피하기 위해 C 14의 `make_integer_sequence` 구현을 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!