С++ 17, устаревшие функции в стандартной библиотеке «памяти»?

Я только что понял, что некоторые функции стандартной библиотеки динамического управления памятью были устарело в C++17. Например, get_temporary_buffer:

template< class T >
std::pair< T*, std::ptrdiff_t > get_temporary_buffer( std::ptrdiff_t count );

Может кто-нибудь объяснить, почему? Могу ли я ожидать, что в C++20 появится альтернатива?


person Picaud Vincent    schedule 19.12.2017    source источник
comment
Он никогда не использовался широко, реализации обычно просто выделяют часть памяти, используя operator new.   -  person StaceyGirl    schedule 19.12.2017
comment
Хорошо, спасибо. Я думал, что это какой-то оптимизированный пул памяти для небольших буферов.   -  person Picaud Vincent    schedule 19.12.2017
comment
Насколько я знаю, он часто используется для реализации std::inplace_merge, который может использовать любую выделенную память, даже если у него не так много памяти, как требуется: чем больше памяти, тем быстрее, но даже без памяти алгоритм все еще работает.   -  person Morwenn    schedule 19.12.2017


Ответы (1)


Согласно предложению, которое осуждает его:

Этот API считался бы незавершенным, если бы он был предложен сегодня. В качестве функционального API ему не хватает безопасности исключений, если происходит утечка функции, выделяющей буфер, но мы не предлагаем оболочек, подобных RAII, для обеспечения безопасного использования.

Было высказано предположение, что все текущие реализации этого API на самом деле не выполняют более эффективное распределение, чем обычный оператор new, и, если это действительно так, нам следует серьезно рассмотреть возможность отказа от этого средства. В противном случае нам, вероятно, следует дополнить проект соответствующим классом защиты/оболочки и поощрять поставщиков использовать упущенные возможности оптимизации.

Короче говоря, просто используйте new/delete. Или ваш собственный временный распределитель памяти; в зависимости от того, что лучше всего подходит для ваших нужд.

person Nicol Bolas    schedule 19.12.2017