小编cod*_*oet的帖子

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
查看次数