相关疑难解决方法(0)

正确的方法(移动语义)从C++ 11中的函数调用返回一个std :: vector

我想填充std :: vector(或其他一些STL容器):

class Foo {
public:
  Foo(int _n, const Bar &_m);
private:
  std::vector<Foo> fooes_;
}
Run Code Online (Sandbox Code Playgroud)

1.好看的ctor,性能昂贵

std::vector<Foo> get_vector(int _n, const Bar &_m) {
  std::vector<Foo> ret;
  ... // filling ret depending from arguments
  return ret;
}

Foo::Foo(int _n, const Bar &_m) : fooes_(get_vector(_n, _m) {}
Run Code Online (Sandbox Code Playgroud)

2.性能更好,看起来更糟糕

void fill_vector(int _n, const Bar &_m, std::vector<Foo> &_ret) {
  ... // filling ret depending from arguments
}

Foo::Foo(int _n, const Bar &_m) { fill_vector(_n, _m, fooes_); }
Run Code Online (Sandbox Code Playgroud)

是否可以get_vector使用C++ 0x(移动语义功能等)重写第一个示例中的函数以避免冗余复制和构造函数调用?

c++ stl move-semantics return-value-optimization c++11

33
推荐指数
3
解决办法
2万
查看次数

编译器如何知道移动局部变量?

我很好奇这个功能是如何工作的.考虑类似的事情

std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }
Run Code Online (Sandbox Code Playgroud)

即使对于仅移动类型,此代码编译也很好,因为编译器会隐式移动它.但从逻辑上讲,对于任何返回表达式,确定结果是否引用局部变量都将解决暂停问题 - 如果编译器只是将所有局部变量视为返回表达式中的rvalues,那么这将成为变量的问题可以多次在该一个表达式中引用.即使本地只有一个直接引用,您也无法证明它没有其他间接别名.

那么编译器如何知道何时从返回表达式移动?

c++ move-semantics c++11

9
推荐指数
2
解决办法
1354
查看次数