Поскольку, какую цель я должен использовать 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 для реализации алгоритмов:
Если никакой буфер не может быть выделен, или если это меньше, чем требуемый, алгоритм все еще работает правильно, Это просто замедляется.
Страуструп говорит в «Язык программирования C ++» ( §19.4.4 , SE):
Идея состоит в том, что система может поддерживать некоторое количество фиксированных буферы, готовые к быстрому распределению, так что запрос пространства для объектов n может дать пространство для более чем n . Однако он также может дать меньше, поэтому один из способов использования
get_porary_buffer ()
- это оптимистично запросить много, а затем использовать то, что оказывается доступным.
[...] Посколькуget_porary_buffer ()
является низкоуровневым и, вероятно, будет оптимизирован для управления временными буферами, его не следует использовать в качестве альтернативы new или распределителю. :: allocate () для получения более длительного хранения.
Он также начинает знакомство с двумя функциями со следующего:
Алгоритмам часто требуется временное пространство для нормальной работы.
... но, похоже, нигде не дает определения временных или долгосрочных .
В анекдоте в «От математики к общему программированию» упоминается, что Степанов предоставил фиктивную реализацию заполнителя в исходном проекте STL, однако:
К своему удивлению, он обнаружил годы спустя все основные производители, предоставляющие реализации STL, все еще используют эту ужасную реализацию [...]
В стандарте говорится, что он выделяет память для до n
элементов.
Другими словами, ваш пример может вернуть буфер, достаточно большой только для 5 объектов.
Однако довольно сложно представить себе хороший вариант использования для этого. Возможно, если вы работаете на платформе с очень ограниченным объемом памяти, это удобный способ получить «как можно больше памяти».
Но на такой платформе с ограничениями, я полагаю, вы должны максимально обойти распределитель памяти и использовать пул памяти или что-то, что вы полностью контролируете.
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 .