我应该用什么目的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) ) );
Run Code Online (Sandbox Code Playgroud)
这个函数只存在于语法糖吗?为什么有temporary它的名字?
1996年7月1日Dr. Dobb's Journal提出了一个用例来实现算法:
如果没有缓冲区可以分配,或者它小于请求的缓冲区,算法仍能正常工作,它只会减慢速度.
我只是想,如果我要实现std::inplace_merge它可能看起来像这样:
template <class Bi, class Cmp>
void inplace_merge(Bi first, Bi middle, Bi last, Cmp cmp) {
if(first != last) {
typedef typename iterator_traits<Bi>::value_type T;
typedef typename iterator_traits<Bi>::difference_type Dist;
const Dist count = distance(first, last);
if(count != 1) {
// can I avoid this allocation?
T *const temp = new T[count];
merge(first, middle, middle, last, temp, cmp);
copy(temp, temp + count, first);
delete [] temp;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用现有的实现,但除了重点之外.如果有比我所知的更好的算法,我只是好奇.
我想到这一点的原因是大多数c ++标准库(如果我没记错的话,所有的STL)都允许用户指定执行分配的方式和位置,但如果std::inplace_merge需要按设计分配,似乎没有办法如果这是一个问题,控制它.
我认为答案的一个暗示来自于标准本身的复杂性std::inplace_merge:
复杂性:当有足够的额外内存可用时,(最后 - …