2017-12-13 31 views
2

무료 저장소 (즉, 힙) 할당을하지 않는 표준 알고리즘의 비 실행 정책 오버로드에 대한 C++ 표준에 대한 보증이 있습니까?C++ 알고리즘 힙 할당 보장

실시간 처리를하고 있는데, 예를 들어 std::max_element을 사용하고 싶지만 힙에 할당하지 않는다고 보장 할 수는 없습니다. 그것은 의미가 없지만 어디서나 명시된 것을 보지 못합니다. 아마 그걸 보장하는 몇 가지 조항이 없을 것 같습니까?

+1

다음을 참조하십시오 : https://stackoverflow.com/a/41475062/748188 – Alireza

+0

'연산자 + (int, int)'가 힙을 사용하지 않는다는 보장조차 없습니다. 왜 더 복잡한 알고리즘에 대한 보증이 기대 되나요? – MSalters

답변

1

표준은 메모리를 할당하는 알고리즘을 금지합니다. 알고리즘이 메모리를 할당하는지 여부에 대한 지식이 유용하거나 필요할 수 있으므로이 사양의 생략은 결함으로 간주 될 수 있습니다 (이 주제에 대한 현저한 결함은 없다고 생각합니다). 메모리를 할당 할 수없는 알고리즘을 지정하는 것은 이러한 할당이 해당 매개 변수의 연산보다는 알고리즘 자체의 연산만을 다루는 것이 분명하다면 너무 나쁘지 않아야합니다. 알고리즘 은 객체 복사본을 사용할 수 있습니다. 메모리 할당이 필요합니다.

이론 상으로는 일부 알고리즘이 임시 버퍼로부터 이익을 얻고 메모리를 할당 할 수 있다고 생각할 수 있습니다. 그러나 실제로는이를 수행 할 몇 가지 알고리즘이 있습니다 (예 : rotate()은 메모리 할당의 이점을 누릴 수 있습니다). std::max_element()과 같은 알고리즘은 지정하지 않았더라도 메모리를 할당하지 않습니다.

+0

일부 알고리즘 (예 :'std :: inplace_merge ')에서는 임시 저장소 (즉, 힙 저장소)를 사용할 수있는 경우 복잡성 요구 사항이 명시 적으로 변경됩니다. 임시 저장소를 제공하는 것이'std :: get_temporary_buffer'의 주된 역할입니다. –

+1

@PeteBecker : 합의. 그러나'std :: max_element()'는 메모리를 추가 할 필요가 없다. 추가 메모리의 사용을 명시 적으로 금지하기 위해 사양을 강화했다면 좋겠지 만 지금은 수행 할 수없는 최선의 방법은 합리적인 가정을하는 것입니다 (또는 알고리즘을 사용하지 않는 것). –

0

나는 그러한 보증에 대한 언급을 직접 찾지 못했습니다. 그러나 cppreference에는 비 실행 정책 오버로드의 경우 std::max_element에 대한 예외는 없습니다.

실행 정책 오버로드에 대해서는 std::bad_alloc을 언급합니다.

이 정보가 맞으면 비 실행 정책 오버로드로 인해 힙에 메모리를 할당 할 수 없다는 것을 의미합니다 (그렇지 않으면 bad::alloc이 표시 될 수 있음).

+2

여전히 '시도 잡아'할당없이 구현으로 돌아갈 수 있습니다 ;-) – Jarod42

+0

@ Jarod42 어, 맞아. 그러나, 그 일을하는 더러운 방법이 될 것입니다 그리고 아무 구현도 바란다 – user463035818

+0

표준 비 실행 정책 알고리즘에 대한 예외와 관련해서는 아무것도 말하지 않는다는 사실을 공식적으로 말하면 * throw 할 수 없다는 것을 의미합니다 예외? – Danra