相关疑难解决方法(0)

移动或命名返回值优化(NRVO)?

可以说我们有以下代码:

std::vector<int> f()
{
  std::vector<int> y;
  ...
  return y;
} 

std::vector<int> x = ...
x = f();
Run Code Online (Sandbox Code Playgroud)

看来编译器有两种方法:

(a)NRVO:Destruct x,然后构造f()代替x.
(b)移动:在temp空间中构造f(),将f()移动到x,destruct f().

根据标准,编译器是否可以自由使用这两种方法?

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

32
推荐指数
1
解决办法
2万
查看次数

C++ 按值返回类对象优化后的内存行踪

假设有一个用户定义的class Foo。一些帖子表明 C++ 类对象“永远”不会在堆上分配,除非使用new. 但!另一方面,有一些帖子建议从函数中按值返回本地外观的类对象不一定会复制任何数据。所以!这样一个对象的数据首先存储在哪里?还在堆吗?它是否被提升到调用函数的堆栈帧?

class Foo {
...
}

Foo a(int x) {
  Foo result;
  doabc(x, result);
  return result;
}

Foo b(int x) {
  Foo result = a(x);
  doxyz(x,result);
  return result;
}

int main() {
    int x;
    cin >> x;
    Foo result = b(x);
    dosomethingelse(result);
    cout << result;
}
Run Code Online (Sandbox Code Playgroud)

如果 a 的 Foo 结果不是按值复制的,那么它在哪里分配?堆还是栈?如果在堆上,编译器是否会自动重构代码以插入删除?如果在堆栈上,它会驻留在哪个堆栈帧上?b 的?这是让我想知道的帖子:/sf/answers/1223171211/。谢谢!

c++ stack-frame return-value-optimization copy-elision

2
推荐指数
1
解决办法
79
查看次数