类别: 分配器 | 组件类型: 函数 |
template <class T> pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len, T*);
对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_fill或uninitialized_fill_n.
如同名称所示,get_temporary_buffer应仅用来获取临时内存。如果一个函数使用get_temporary_buffer分配内存,则它必须在返回前使用return_temporary_buffer [3]释放该内存。
请注意 get_temporary_buffer和return_temporary_buffer仅出于向后兼容性而提供。如果您要编写新代码,则应该使用temporary_buffer类。
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.