SGI

get_temporary_buffer

类别: 分配器 组件类型: 函数

原型

template <class T>
pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len, T*);

描述

某些算法,例如stable_sortinplace_merge自适应算法:它们尝试使用额外的临时缓冲区来存储中间结果,如果这些额外缓冲区可用,则它们运行得更快。

get_temporary_buffer的第一个参数指定临时缓冲区请求的大小,第二个参数指定将在缓冲区中存储的对象类型。也就是说,get_temporary_buffer(len, (T*) 0)请求一个缓冲区,该缓冲区与类型T的对象对齐且足够大到能容纳len个类型为T. [1]

get_temporary_buffer返回的值pairP,其第一个组件为临时缓冲区的指针,第二个参数表示缓冲区的大小:P.first 指向的缓冲区足够大,能容纳P.second个类型为T. P.second大于或等于0 [2],小于或等于len [1]。请注意,P是指向未初始化内存,而不是指向类型为T的实际对象;此内存可以使用uninitialized_copy, uninitialized_filluninitialized_fill_n.

如同名称所示,get_temporary_buffer应仅用来获取临时内存。如果一个函数使用get_temporary_buffer分配内存,则它必须在返回前使用return_temporary_buffer [3]释放该内存。

请注意 get_temporary_bufferreturn_temporary_buffer仅出于向后兼容性而提供。如果您要编写新代码,则应该使用temporary_buffer类。

定义

在标准头文件 memory 和非标准向后兼容性头文件 algo.h 中定义。

对类型的要求

前置条件

复杂度

示例

int main()
{
  pair<int*, ptrdiff_t> P = get_temporary_buffer(10000, (int*) 0);
  int* buf = P.first;
  ptrdiff_t N = P.second;
  uninitialized_fill_n(buf, N, 42);
  int* result = find_if(buf, buf + N, bind2nd(not_equal_to<int>(), 42));
  assert(result == buf + N);
  return_temporary_buffer(buf);
}        

注释

[1] 参数len是一个请求,而不是一个需求。意图是get_temporary_buffer将返回一个尽可能大的缓冲区,而不会影响性能。请注意,确定此最大值相当困难:它取决于缓存大小、物理内存与虚拟内存、堆碎片等。一个优秀的get_temporary_buffer实现一定是不可移植的。

[2] 如果P.second为 0,这意味着get_temporary_buffer无法分配任何临时缓冲区。这种情况下,P是一个空指针。

[3] 尚未指定get_temporary_buffer是用malloc::operator new,或一些其他方法实现的。使用get_temporary_buffer分配内存并返回内存的唯一可移植方法是使用return_temporary_buffer.

另请参阅

temporary_buffer, return_temporary_buffer, 分配器
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息