相关疑难解决方法(0)

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?他们意味着什么?

它们会在什么情况下发生?有什么限制?

c++ optimization c++-faq return-value-optimization copy-elision

350
推荐指数
4
解决办法
7万
查看次数

如何找到 C++ 虚假复制操作?

最近,我有以下情况

struct data {
  std::vector<int> V;
};

data get_vector(int n)
{
  std::vector<int> V(n,0);
  return {V};
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于,在创建结构体时会发生一个副本,而解决方案是编写return {std::move(V)}

是否有可以检测这种虚假复制操作的 linter 或代码分析器?cppcheck、cpplint 和 clang-tidy 都做不到。

编辑:几点让我的问题更清楚:

  1. 我知道发生复制操作是因为我使用了编译器资源管理器,它显示了对memcpy的调用。
  2. 我可以通过查看标准 yes 来确定发生了复制操作。但我最初的错误想法是编译器会优化掉这个副本。我错了。
  3. 这(很可能)不是编译器问题,因为 clang 和 gcc 都产生产生memcpy 的代码。
  4. memcpy 可能很便宜,但我无法想象复制内存和删除原始内存比通过std::move传递指针便宜的情况。
  5. 添加std::move是一个基本操作。我想代码分析器将能够建议此更正。

c++ code-analysis static-code-analysis cppcheck

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