c++ - 我是否正确测试了返回值优化?

标签 c++ return-value-optimization

考虑:

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://godbolt.org/z/FCRtY9

正如评论中所暗示的,这与结构的大小有关。如果该结构适合寄存器,则地址可能会更改。

创建更大的结构后,地址保持不变。

请注意,复制省略一定会发生: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/

相关文章:

c++ - 为什么这不按升序打印数字

用于检查字符串是否平衡 ()、{} 和 [] 的 C++ 程序

c++ - 对临时和复制的 const 引用 - C++

c++ - 我是否会受益于应用 move 语义或将对以字符串形式返回文件内容的函数执行返回值优化?

c++ - 为什么 RVO 要求如此严格?

c++ - delete 一定是析构函数中的最后一条语句吗?

C++如何使用fstream读取带空格的制表符分隔文件

c++ - 从字符串输入格式调用 C++ 成员函数

c++ - 了解返回值优化和返回临时值 - C++

c++ - 如何仅针对一种类型禁用 C++ 返回值优化?