繁体   English   中英

优化向量分配c ++

[英]Optimizing vector assignment c++

我有一个返回向量的函数。 我们把它命名为v 我在函数中使用v.begin()v.end() 我怎样才能使用.begin().end()而无需创建一个新的向量v2来存储前一个向量v这样我就可以访问方法了?

这就是我的意思:

std::vector<int> merge(...) {
    ...
    return v;
}
void mergeSort(...) {
    ...
    std::vector<int> v2;
    v2 = merge(...);
    I_need_this = v2.begin();
    And_I_really_need_this_too = v2.end();
    ...
}

优化分配的最佳方法是根本不分配,而是使用初始化

std::vector<int> v2 = merge(...);

几乎可以肯定,编译器会直接在v2创建v ,而不进行任何复制。

当您需要返回集合时,为了防止它们被复制,常见的模式是通过非const引用传递集合并对原始集合进行更改。 这意味着调用者负责实例化集合,而不是被调用者,因此不会发生任何副本。 这是一个例子:

void merge(std::vector<int> & result, ...) {

    // Do changes to result
    ...
}
void mergeSort(...) {
    ...
    std::vector<int> v;
    merge(v, ...);

    // This is OK now
    I_need_this = v.begin();
    And_I_really_need_this_too = v.end();
    ...
}

您可以将临时矢量绑定到引用:

extern std::vector<int> f();

auto&& x = f();
std::sort(x.begin(), x.end());  // example

你有很多选择:

  1. 别担心。 性能通常不那么重要。

  2. 启用优化(您会惊讶地发现SO上有多少“优化”问题通过该步骤解决)。

  3. 升级到C ++ 11编译器。 编译器应该使用向量的移动赋值运算符,这非常有效(任何像样的库都会将内部分配的数组从临时数据传输到目标而没有内存分配,也没有复制元素)。

  4. 如果您不能使用C ++ 11编译器,或者您已经测量过,并且这仍然是性能瓶颈,请按照Bo Person在他的回答中的建议切换到初始化

  5. 如果你已经测量过,这仍然是一个性能瓶颈,并且你无法让你的编译器实现RVO,那么你别无选择,只能按照AndréFratelli在他的回答中的建议传递矢量值

如果我们退出讨论优化,并讨论编写好的,清晰的代码,那么我会按优先顺序推荐:

  • 从函数结果初始化
  • 从功能结果分配
  • 通过向量填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM