std :: vector (ab)는 자동 저장을 사용합니다 고려하십시오. #include <array> int main() { using huge_type

다음 스 니펫을 고려하십시오.

#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 API가 사용하는 자동 스토리지의 양에는 제한이 없습니다.

모두 12 테라 바이트의 스택 공간이 필요할 수 있습니다.

그러나 해당 API에는 만 필요 Cpp17DefaultInsertable하며 구현시 생성자에 필요한 추가 인스턴스가 생성됩니다. 객체가 사소하게 왜곡되고 복사 가능한 것으로 감지되지 않는 한 그 구현은 불법으로 보입니다.


답변

huge_type t;

분명히 그것은 대부분의 플랫폼에서 충돌 할 것입니다 …

나는 “가장”이라는 가정에 이의를 제기한다. 거대한 객체의 메모리는 절대 사용되지 않기 때문에 컴파일러는이를 완전히 무시하고 메모리를 할당 할 수 없으며이 경우 충돌이 발생하지 않습니다.

문제는 그것이 적합한 구현인지 여부입니다.

C ++ 표준은 스택 사용을 제한하거나 스택의 존재를 인정하지 않습니다. 예, 표준을 준수합니다. 그러나 이것을 구현 품질 문제라고 생각할 수 있습니다.

그것은 실제로 거대한 유형의 벡터의 사용이 상당히 제한적이라는 것을 의미합니다.

libstdc ++의 경우처럼 보입니다. 충돌은 libc ++ (clang 사용)로 재현되지 않았으므로 언어의 제한이 아니라 특정 구현에서만 발생하는 것으로 보입니다.


답변

저는 언어 변호사 나 C ++ 표준 전문가는 아니지만 cppreference.com은 말합니다.

explicit vector( size_type count, const Allocator& alloc = Allocator() );

기본적으로 삽입 된 개수가 T 인 컨테이너를 구성합니다. 사본이 없습니다.

아마도 “default-inserted”를 오해하고 있지만 다음과 같이 기대합니다.

std::vector<huge_type> v(1);

동등하다

std::vector<huge_type> v;
v.emplace_back();

후자의 버전은 스택 복사본을 생성하지 말고 벡터의 동적 메모리에 직접 huge_type을 구성해야합니다.

나는 당신이보고있는 것이 준수하지 않는다고 권위적으로 말할 수는 없지만 품질 구현에서 기대하는 것은 아닙니다.