최근에 나는 std::string s
주어진 다음 진술이 사실이 아니라고 나타났습니다.왜 std :: string :: max_size() == std :: string :: allocator :: max_size()
s.max_size() == s.get_allocator().max_size();
나는이 흥미로운 기본적 std::string
으로 size_type(-1)
의 이론적 인 한계가 std::allocator<char>
사용 찾을 (예 내가 2의 보수를 있으리라 믿고있어 알을하지만 실제 질문에 관련되지 않은). 실용적인 제한은 이보다 훨씬 적을 것입니다. 일반적인 32 비트, x86 시스템에서 커널은 2GB (아마도 1GB)의 주소 공간을 차지하며 실용적인 상한선은 훨씬 작습니다.
어쨌든 GNU libstdC++의 std::basic_string<>::max_size()
은 사용하는 할당자가 무엇을 말하는지와 상관없이 같은 값을 반환하는 것처럼 보입니다 (1073741820
과 같은 것).
그럼 질문이 남아 있습니다. 왜 std::basic_string<>::max_size()
은 단지 get_allocator().max_size()
을 반환하지 않습니까? 이것이 나에게 가상의 상한선 인 것 같습니다. 할당이 짧아지면 std::bad_alloc
을 던집니다. 왜 시도하지 않으시겠습니까?
이것은 다른 무엇보다 호기심입니다. 나는이 두 구현이 적어도이 구현에서 왜 분리되어 있는지 궁금합니다.
"그리고 경우를. 할당이 짧아지면, 그냥 std :: bad_alloc을 던질 것이므로, 왜 시도하지 않겠습니까? "나는 당신에게 대답 할 수있다. 사람들은 커다란 문자열을 처리해야하고 커다란 문자열 덩어리로 나눌 필요가있을 수 있습니다. 실제로 max_size가보고하는 내용에 의존 할 수없는 경우 임시 제한에 의존해야합니다. – GManNickG
나는 당신의 요지를 보았지만, 나는 동의하지 않는다. 현실은 꽤 많은 문자열 크기 (= max_size()가 외부 변수에 의존하기 때문에 실패 할 가능성이 있다고 가정해야한다는 것입니다 (힙에서 사용할 수있는 양). –
동의. 나의 유일한 요점은 그들이 최소한 정확성을 기하기 위해 노력해야한다는 것입니다. 실용적인 숫자에 최선의 희망을주십시오. :) 힘든 질문. – GManNickG