Почему делают мне нужен станд.:: get_temporary_buffer?

Поскольку, какую цель я должен использовать std::get_temporary_buffer? В стандарте говорится следующее:

Получает указатель на устройство хранения данных, достаточное для хранения до n смежных объектов T.

Я думал, что буфер будет выделен на стеке, но это не верно. Согласно Стандарту C++ этот буфер является на самом деле не временным. Что преимущества делает эту функцию, имеют по глобальной функции ::operator new, который не создает объекты также. Действительно ли я прав, что следующие утверждения эквивалентны?

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

Это функционирует, только существуют для сахара синтаксиса? Почему там temporary на его имя?


Один вариант использования был предложен в Журнале доктора Dobb, 01 июля 1996 для реализации алгоритмов:

Если никакой буфер не может быть выделен, или если это меньше, чем требуемый, алгоритм все еще работает правильно, Это просто замедляется.

84
задан Kirill V. Lyadvinsky 31 August 2013 в 22:13
поделиться

3 ответа

Страуструп говорит в «Язык программирования C ++» ( §19.4.4 , SE):

Идея состоит в том, что система может поддерживать некоторое количество фиксированных буферы, готовые к быстрому распределению, так что запрос пространства для объектов n может дать пространство для более чем n . Однако он также может дать меньше, поэтому один из способов использования get_porary_buffer () - это оптимистично запросить много, а затем использовать то, что оказывается доступным.
[...] Поскольку get_porary_buffer () является низкоуровневым и, вероятно, будет оптимизирован для управления временными буферами, его не следует использовать в качестве альтернативы new или распределителю. :: allocate () для получения более длительного хранения.

Он также начинает знакомство с двумя функциями со следующего:

Алгоритмам часто требуется временное пространство для нормальной работы.

... но, похоже, нигде не дает определения временных или долгосрочных .

В анекдоте в «От математики к общему программированию» упоминается, что Степанов предоставил фиктивную реализацию заполнителя в исходном проекте STL, однако:

К своему удивлению, он обнаружил годы спустя все основные производители, предоставляющие реализации STL, все еще используют эту ужасную реализацию [...]

43
ответ дан 24 November 2019 в 08:39
поделиться

В стандарте говорится, что он выделяет память для до n элементов. Другими словами, ваш пример может вернуть буфер, достаточно большой только для 5 объектов.

Однако довольно сложно представить себе хороший вариант использования для этого. Возможно, если вы работаете на платформе с очень ограниченным объемом памяти, это удобный способ получить «как можно больше памяти».

Но на такой платформе с ограничениями, я полагаю, вы должны максимально обойти распределитель памяти и использовать пул памяти или что-то, что вы полностью контролируете.

9
ответ дан 24 November 2019 в 08:39
поделиться
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 ) );

фактический размер базы должен быть больше или равен require .

2
ответ дан 24 November 2019 в 08:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: