考虑:
struct Measures {
char name[128]; // added in response to comments
int age;
float weight;
};
Measures foo() {
Measures res;
cout << &res << endl;
return res;
}
int main() {
Measures m = foo();
cout << &m << endl;
system("pause");
return 0;
}
在 Visual Studio 中运行此代码得到的输出是:
004FFA30
004FFB28
根据两个地址不同,我是否正确地得出没有执行返回值优化的结论?如果是这样,为什么在这种情况下不执行它(我发现了几篇涉及 Visual Studio 2017(版本 15.9.14)不执行返回值优化的帖子,但它们似乎都不是关于这种特殊情况的)?
最佳答案
正如评论中所暗示的,这与结构的大小有关。如果该结构适合寄存器,则地址可能会更改。
创建更大的结构后,地址保持不变。
请注意,复制省略一定会发生:https://stackoverflow.com/a/48881336/461597
#include <iostream>
using std::cout;
using std::endl;
struct Measures {
int age;
float weight;
};
struct BigMeasures {
Measures m;
int foo, bar, moo, mar;
};
Measures foo() {
Measures res;
cout << &res << endl;
return res;
}
BigMeasures bar() {
BigMeasures res;
std::cout << &res << "\n";
return res;
}
int main() {
std::cout << "Small Measures:\n";
Measures m = foo();
cout << &m << endl;
std::cout << "Big Measures:\n";
BigMeasures bm = bar();
std::cout << &bm << "\n";
return 0;
}
关于c++ - 我是否正确测试了返回值优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59855066/