首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要std::get_temporary_buffer?

为什么我需要std::get_temporary_buffer?
EN

Stack Overflow用户
提问于 2010-07-16 11:25:38
回答 6查看 10.8K关注 0票数 88

为了什么目的我应该使用std::get_temporary_buffer?标准规定如下:

获取指向足以存储到n个相邻T对象的存储的指针。

我认为将在堆栈上分配缓冲区,但事实并非如此。根据C++标准,这个缓冲区实际上不是临时的。与不构造对象的全局函数::operator new相比,该函数有什么优势。下面的陈述是等价的,我说得对吗?

代码语言:javascript
复制
int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );

这个函数只存在于语法糖中吗?为什么temporary在它的名字里?

Dobb博士杂志,1996年7月1日中提出了一个用于实现算法的用例:

如果无法分配缓冲区,或者如果缓冲区小于请求,则该算法仍能正常工作,它只是减慢了速度。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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实现的主要供应商仍然在使用这个可怕的实现.

票数 48
EN

Stack Overflow用户

发布于 2014-11-11 09:07:37

微软的标准库家伙说:这里

  • 你能解释一下什么时候使用“get_temporary_buffer”吗

它有一个非常特殊的用途。注意,它不抛出异常,比如new ( Note ),但它也不构造对象,不像new (Note)。

在像stable_partition()这样的算法中,STL在内部使用。当有像N3126 25.3.13算法/11这样的神奇词汇时,就会出现这种情况: stable_partition()具有复杂性,“最多(最后-第一)*日志(最后-第一)交换,但如果有足够的额外内存,则只有线性数量的交换”。当出现神奇的单词“如果有足够的额外内存”时,STL将使用get_temporary_buffer()来尝试获取工作空间。如果可以,则可以更有效地实现该算法。如果不能,因为系统正在危险地接近内存不足(或者所涉及的范围很大),该算法可能会退回到较慢的技术。

99.9%的STL用户不需要知道get_temporary_buffer()。

票数 19
EN

Stack Overflow用户

发布于 2010-07-16 11:37:28

标准说,它为分配存储空间,最多分配到 n元素。换句话说,您的示例可能只返回一个足以容纳5个对象的缓冲区。

然而,很难想象有一个很好的用例来解决这个问题。也许,如果您在一个非常内存受限的平台上工作,这是获取“尽可能多的内存”的一种方便的方法。

但是在这样一个受限的平台上,我可以想象您会尽可能地绕过内存分配程序,使用一个内存池或您完全可以控制的东西。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3264299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档