다음 스 니펫을 고려하십시오.
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
기본 스택 크기는 일반적으로 20MB보다 작기 때문에 대부분의 플랫폼에서 충돌이 발생합니다.
이제 다음 코드를 고려하십시오.
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
놀랍게도 충돌합니다! 역 추적 (최근 libstdc ++ 버전 중 하나 포함)은 include/bits/stl_uninitialized.h
파일로 연결되어 다음 줄을 볼 수 있습니다.
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
크기 조정 vector
생성자는 요소를 기본적으로 초기화해야하며 이것이 구현 방법입니다. 분명히 _ValueType()
일시적으로 스택이 충돌합니다.
문제는 그것이 적합한 구현인지 여부입니다. 그렇다면 실제로 거대한 유형의 벡터 사용이 상당히 제한적이라는 것을 의미합니다.
std::allocator
이 사용 된 경우에만 사용됩니다.