glibc의 문자열 구현을 사용하여 스택에 std::string을 어떻게 할당합니까?

StackOverflow https://stackoverflow.com/questions/783944

문제

int main(void)
{
   std::string foo("foo");
}

제가 이해한 바에 따르면 위의 코드는 기본 할당자를 사용하여 new를 호출합니다.따라서 std::string foo가 스택에 할당되더라도 foo 내부의 내부 버퍼는 힙에 할당됩니다.

스택에 완전히 할당되는 문자열을 생성하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

나는 최근에 이 작업을 직접 수행하고 싶었고 다음 코드가 빛나는 것을 발견했습니다.

Chronium의 stack_container.h

이는 새로운 것을 정의합니다. std::allocator 이는 STL 컨테이너에 대한 초기 스토리지 할당을 위한 스택 기반 할당을 제공할 수 있습니다.특정 문제를 해결하기 위한 다른 방법을 찾게 되었기 때문에 실제로 코드를 직접 사용하지는 않았지만 아마도 여러분에게 유용할 것입니다.사용법과 주의사항에 관한 코드의 주석을 꼭 읽어보세요.

이 작업의 유용성과 건전성에 의문을 제기하는 사람들은 다음을 고려하십시오.

  • 종종 문자열의 최대 크기가 합리적이라는 것을 미리 알고 있는 경우가 있습니다.예를 들어, 문자열이 10진수 형식의 32비트 정수를 저장하려는 경우 이를 위해 11자 이상이 필요하지 않다는 것을 알고 있습니다.이 경우 동적으로 크기를 무제한으로 늘릴 수 있는 문자열은 필요하지 않습니다.
  • 대부분의 경우 스택에서 할당하는 것이 힙에서 할당하는 것보다 빠릅니다.
  • 문자열이 자주 생성되고 삭제되는 경우(일반적으로 사용되는 유틸리티 함수의 지역 변수라고 가정) 힙 대신 스택에서 할당하면 힙 할당자에서 조각화를 유발하는 변동이 방지됩니다.많은 메모리를 사용하는 애플리케이션의 경우 이는 게임 체인저가 될 수 있습니다.

어떤 사람들은 스택 기반 할당을 사용하는 문자열이 std::string 마치 이것이 어떻게든 그것의 유용성을 감소시키는 것처럼 말입니다.사실, 두 가지를 서로 바꿔 사용할 수 없으므로 통과할 수 없습니다. stackstring 기대하는 기능에 std::string.그러나 (만약 당신이 올바르게 한다면) 당신은 당신의 컴퓨터에서 동일한 멤버 함수를 모두 사용할 수 있을 것입니다. stackstring 지금 사용하는 것 std::string, 좋다 find_first_of(), append(), 등. begin() 그리고 end() 여전히 잘 작동하므로 많은 STL 알고리즘을 사용할 수 있습니다.물론이죠. 그렇지 않을 거예요 std::string 가장 엄격한 의미에서는 여전히 "문자열"이 될 것이며 여전히 매우 유용할 것입니다.

다른 팁

문제는 그 것입니다 std::basic_string 할당자를위한 템플릿 매개 변수가 있습니다. 하지만 std::string 템플릿이 아니며 매개 변수가 없습니다.

따라서 원칙적으로 인스턴스화를 사용할 수 있습니다. std::basic_string 스택에 메모리를 사용하는 할당자를 사용하면 std::string. 특히, 당신은 런타임 다형성을 얻지 못할 것이며, 결과 객체를 std::string.

당신은 할 수 없습니다. 제외하고...

std::string 인스턴스화입니다

std::basic_string<class CharType, 
                  class Traits=char_traits<CharType>, 
                  class Allocator=allocator<CharType> >

사용하는 할당 클래스를 정의 할 수 있습니다 Alloca 메모리 관리를 위해. 이것은 Allocator 자체가있는 경우에만 작동합니다. basic_string 직접 또는 간접적으로 호출하는 방법은 모두 inline. ㅏ basic_string 이 할당 자로 만든 객체는 그렇지 않습니다 ~이다std::string, 그러나 그것은 대부분 그것을 좋아할 것입니다. 그러나 이것은 제한된 이익을위한 상당한 양의 작업 일 것입니다. 구체적으로,이 클래스를 사용하여 함수에서 값을 반환하는 것은 경력 제한적인 움직임입니다.

나는 모른다 당신이나 다른 사람이 이것을하고 싶어 할 것입니다.

그런 일을하기가 어려울 것이라고 생각합니다. 왜 그렇게하고 싶은지 궁금합니다. 스택에 완전히 할당하려면 컴파일러는 컴파일 시간에 정확한 크기가 무엇인지 알아야합니다. 예에서는 크기를 알아야 할 것입니다. std::string 메타 데이터뿐만 아니라 문자열 데이터 자체의 크기도 있습니다. 이것은 너무 유연하지 않으며, 포함하려는 문자열 데이터의 크기에 따라 다른 문자열 유형이 필요할 것입니다.

  • STD :: String은 항상 New/Delete를 사용하여 내부 스토리지를 관리합니다.
  • 질문에 왜 포함되어 있는지 확실하지 않습니다 GLIBC의 문자열 구현. C ++ 표준 라이브러리의 문자열 구현은 glibc.
  • 스택에 문자열을 저장하는 유일한 방법은 스택에 C char 어레이를 사용하는 것입니다 (Shhnap이 설명 한 것과 같이). 그러나 그것은 아마 당신이 어쨌든 원하는 것이 아닐 것입니다 :-)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top