Programing

std :: get_temporary_buffer가 필요한 이유는 무엇입니까?

lottogame 2020. 9. 19. 11:51
반응형

std :: get_temporary_buffer가 필요한 이유는 무엇입니까?


어떤 용도로 사용해야 std::get_temporary_buffer합니까? Standard는 다음과 같이 말합니다.

최대 n 개의 인접한 T 개체를 저장하기에 충분한 저장소에 대한 포인터를 가져옵니다.

버퍼가 스택에 할당 될 것이라고 생각했지만 사실이 아닙니다. C ++ 표준에 따르면이 버퍼는 실제로 일시적인 것이 아닙니다. 이 함수는 ::operator new객체를 구성하지 않는 전역 함수에 비해 어떤 이점이 있습니다. 다음 진술이 동등하다는 것이 맞습니까?

int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );

이 함수는 구문 설탕에만 존재합니까? temporary그 이름에 있습니까?


알고리즘 구현을 위해 1996 년 7 월 1 일 Dr. Dobb의 저널 에서 한 가지 사용 사례가 제안되었습니다 .

버퍼를 할당 할 수 없거나 요청한 것보다 작 으면 알고리즘이 여전히 올바르게 작동하며 속도가 느려질뿐입니다.


Stroustrup은 "The C ++ Programming Language" ( §19.4.4 , SE)에서 다음과 같이 말합니다 .

이 아이디어는 시스템이 빠른 할당에 대한 준비가 고정 된 크기 버퍼의 수를 유지할 수 있다는 것이다 그래서 공간을 요구하는 n 개의 객체가보다 더 많은 공간을 얻을 수 없음 . 그러나 더 적은 수익을 얻을 수도 있으므로 사용하는 한 가지 방법은 get_temporary_buffer()낙관적으로 많은 것을 요청한 다음 사용 가능한 것을 사용하는 것입니다.
[...] get_temporary_buffer()은 저수준이고 임시 버퍼 관리에 최적화 될 가능성이 높기 때문에 장기 저장을 얻기 위해 new 또는 allocator :: allocate () 의 대안으로 사용해서는 안됩니다 .

또한 다음과 같이 두 가지 기능에 대한 소개를 시작합니다.

알고리즘이 제대로 작동하려면 종종 임시 공간이 필요합니다.

...하지만 어디에서나 일시적 또는 장기적인 정의를 제공하지 않는 것 같습니다 .

"수학에서 일반 프로그래밍으로"일화 에서는 Stepanov가 원래 STL 디자인에서 가짜 자리 표시 자 구현을 제공했다고 언급합니다.

놀랍게도 그는 STL 구현을 제공하는 모든 주요 공급 업체가 여전히이 끔찍한 구현을 사용하고 있다는 사실을 몇 년 후 발견했습니다. [...]


Microsoft의 표준 라이브러리 담당자는 다음과 같이 말합니다 ( 여기 ).

  • 언제 'get_temporary_buffer'를 사용해야하는지 설명해 주시겠습니까?

그것은 매우 특별한 목적을 가지고 있습니다. new (nothrow)와 같은 예외를 던지지는 않지만 new (nothrow)와 달리 객체를 생성하지 않습니다.

stable_partition ()과 같은 알고리즘에서 STL에 의해 내부적으로 사용됩니다. 이것은 N3126 25.3.13 [alg.partitions] / 11과 같은 마법의 단어가있을 때 발생합니다. stable_partition ()은 복잡도를 갖습니다. "최대 (마지막-처음) * 로그 (마지막-처음) 스왑이지만, 스왑의 선형 수만 있습니다. 충분한 추가 메모리입니다. " "추가 메모리가 충분한 경우"라는 마법의 단어가 나타나면 STL은 get_temporary_buffer ()를 사용하여 작업 공간을 확보하려고합니다. 가능하다면 알고리즘을보다 효율적으로 구현할 수 있습니다. 그렇게 할 수 없다면 시스템이 메모리 부족에 가깝게 실행 중이거나 관련 범위가 엄청 나기 때문에 알고리즘이 더 느린 기술로 되돌아 갈 수 있습니다.

STL 사용자의 99.9 %는 get_temporary_buffer ()에 대해 알 필요가 없습니다.


표준은 최대 n 요소에 대한 스토리지를 할당한다고 말합니다 . 즉, 예제는 5 개의 객체에 대해서만 충분히 큰 버퍼를 반환 할 수 있습니다.

이것에 대한 좋은 사용 사례를 상상하는 것은 꽤 어렵습니다. 메모리가 매우 제한된 플랫폼에서 작업하는 경우 "가능한 한 많은 메모리"를 얻는 편리한 방법 일 수 있습니다.

그러나 그러한 제한된 플랫폼에서는 가능한 한 메모리 할당자를 우회하고 메모리 풀이나 사용자가 완전히 제어 할 수있는 것을 사용한다고 상상합니다.


어떤 용도로 사용해야합니까? std::get_temporary_buffer?

이 함수 는 C ++ 17에서 더 이상 사용되지 않으므로 정답은 이제 "용도없이 사용하지 마십시오"입니다.


ptrdiff_t            request = 12
pair<int*,ptrdiff_t> p       = get_temporary_buffer<int>(request);
int*                 base    = p.first;
ptrdiff_t            respond = p.sencond;
assert( is_valid( base, base + respond ) );

응답요청 보다 적을 수 있습니다 .

size_t require = 12;
int*   base    = static_cast<int*>( ::operator new( require*sizeof(int) ) );
assert( is_valid( base, base + require ) );

the actual size of base must greater or equal to require.


Perhaps (just a guess) it has something to do with memory fragmentation. If you heavily keep allocating and deallocating temporal memory, but each time you do it you allocate some long-term intended memory after allocating the temp but before deallocating it, you may end up with a fragmented heap (I guess).

So the get_temporary_buffer could be intended to be a bigger-than-you-would-need chunk of memory that is allocated once (perhaps there are many chunks ready for accepting multiple requests), and each time you need memory you just get one of the chunks. So the memory doesn't get fragmented.

참고URL : https://stackoverflow.com/questions/3264299/why-do-i-need-stdget-temporary-buffer

반응형