可以在堆上分配右值向量吗?

时间:2014-04-01 10:05:41

标签: c++

我不确定我是否在这里使用了正确的术语,但我说我有一个返回向量的函数:

std::vector<int> func()
{
    std::vector<int> vec(100,1);
    return vec;
}

当我调用这个函数时,我想在堆上分配向量。我可以这样做吗?

我正在思考这个问题:

std::shared_ptr<std::vector<int>> vec(new std::vector<int>);
vec->swap(func());

有没有一种方法可以在不改变func()的情况下解决这个问题?

3 个答案:

答案 0 :(得分:2)

只是尝试删除std::move,这是一个特定的编译器异常,以避免你放置std::move并让编译器完成剩下的工作。

std::vector<int> func()
{
    std::vector<int> vec(100,1);
    return vec; // NOT: return std::move(vec);
}

为什么?

因为,自动对象vec将在执行return后销毁,并且在这种情况下它的行为与rvalue相同。然后编译器将移动它。放std::move会使编译器烦扰NRVO。

简单地返回矢量进行了优化,不用担心性能。

答案 1 :(得分:1)

我能想到的唯一更好的方法是不使用std::move,因为编译器会自动执行RVO

第二个表达式可以缩短一点:

std::vector<int>* vec2 = new std::vector<int>( f() );

就像其他人所说的那样,在堆上分配矢量并不是非常必要的

答案 2 :(得分:-2)

我不知道你在做什么,如果你想在你的系统内存中有更多碎片,你可以在没有任何权衡的情况下从堆栈中优化多少,或者从堆中优化?如果你需要分配数百万条记录,那么你的第一件事就是我的第一件事就是你的代码中存在的操作可能会损坏它。其次,堆大小是有限的,那么你需要重新实现你的分配器来处理&#34;如何处理小内存和大数据存储&#34;。 如果你坚持优化策略而不是堆管理,那么返回指向vector的指针似乎很有希望

std::vector<int*>* yourfunc()
{
    // do something
    return pVec;
}

然后应用new方法,但仍需要删除对象。