相关疑难解决方法(0)

为什么我需要std :: get_temporary_buffer?

我应该用什么目的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提出了一个用例来实现算法:

如果没有缓冲区可以分配,或者它小于请求的缓冲区,算法仍能正常工作,它只会减慢速度.

c++ buffer memory-management stl temporary

84
推荐指数
4
解决办法
8783
查看次数

是否可以在没有临时存储的情况下进行就地合并?

我只是想,如果我要实现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:

复杂性:当有足够的额外内存可用时,(最后 - …

c++ algorithm

12
推荐指数
1
解决办法
3080
查看次数

标签 统计

c++ ×2

algorithm ×1

buffer ×1

memory-management ×1

stl ×1

temporary ×1