为了什么目的我应该使用std::get_temporary_buffer?标准规定如下:
获取指向足以存储到n个相邻T对象的存储的指针。
我认为将在堆栈上分配缓冲区,但事实并非如此。根据C++标准,这个缓冲区实际上不是临时的。与不构造对象的全局函数::operator new相比,该函数有什么优势。下面的陈述是等价的,我说得对吗?
int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );这个函数只存在于语法糖中吗?为什么temporary在它的名字里?
在Dobb博士杂志,1996年7月1日中提出了一个用于实现算法的用例:
如果无法分配缓冲区,或者如果缓冲区小于请求,则该算法仍能正常工作,它只是减慢了速度。
发布于 2010-07-16 12:06:16
Stroustrup用“C++编程语言”(第19.4.4节,SE)说:
其思想是,系统可能会保持大量固定大小的缓冲区,以便快速分配,以便为n个对象请求空间可能产生大于n的空间,但也可能产生较少的空间,因此使用
get_temporary_buffer()的一种方法是乐观地要求很多,然后使用碰巧可用的空间。 ..。因为get_temporary_buffer()是低级别的,并且可能是为管理临时缓冲区而优化的,所以不应该使用它作为新的或分配程序::分配()来获得长期存储的替代。
他还首先介绍了这两项职能:
算法通常需要临时空间来执行可接受的操作。
..。但似乎并没有给出暂时性或长期性的定义。
然而,奇闻轶事 in https://rads.stackoverflow.com/amzn/click/com/0321942043提到Stepanov在最初的STL设计中提供了一个虚假的占位符实现:
令他惊讶的是,几年后他发现所有提供STL实现的主要供应商仍然在使用这个可怕的实现.
发布于 2014-11-11 09:07:37
微软的标准库家伙说:这里:
它有一个非常特殊的用途。注意,它不抛出异常,比如new ( Note ),但它也不构造对象,不像new (Note)。
在像stable_partition()这样的算法中,STL在内部使用。当有像N3126 25.3.13算法/11这样的神奇词汇时,就会出现这种情况: stable_partition()具有复杂性,“最多(最后-第一)*日志(最后-第一)交换,但如果有足够的额外内存,则只有线性数量的交换”。当出现神奇的单词“如果有足够的额外内存”时,STL将使用get_temporary_buffer()来尝试获取工作空间。如果可以,则可以更有效地实现该算法。如果不能,因为系统正在危险地接近内存不足(或者所涉及的范围很大),该算法可能会退回到较慢的技术。
99.9%的STL用户不需要知道get_temporary_buffer()。
发布于 2010-07-16 11:37:28
标准说,它为分配存储空间,最多分配到 n元素。换句话说,您的示例可能只返回一个足以容纳5个对象的缓冲区。
然而,很难想象有一个很好的用例来解决这个问题。也许,如果您在一个非常内存受限的平台上工作,这是获取“尽可能多的内存”的一种方便的方法。
但是在这样一个受限的平台上,我可以想象您会尽可能地绕过内存分配程序,使用一个内存池或您完全可以控制的东西。
https://stackoverflow.com/questions/3264299
复制相似问题