问答

C++右值引用问题

作者:admin 2021-04-10 我要评论

我想测试一下右值引用传递,写了这样的代码 #include iostreamusing namespace std;class Foo{public: int a = 0; Foo() { cout "ctor: " this endl; } ~Foo() {...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

我想测试一下右值引用传递,写了这样的代码

#include <iostream>
using namespace std;
class Foo
{

public:
    int a = 0;
    Foo()
    {
        cout << "ctor: " << this << endl;

    }
    ~Foo() {
       cout << "dtor: " << this << endl;
    }
};

Foo f()
{
    Foo foo;
    cout << "f " << &foo << endl;
    return foo;
}
void ff(Foo &&ffoo)
{
    cout << "ff " << &ffoo << endl;

}

int main()
{
    ff(f());
    std::cout << "Hello World!\n";
}

输出的地址都一样,看起来很正常

ctor: 0x7ffeda89bd7c
f 0x7ffeda89bd7c
ff 0x7ffeda89bd7c
dtor: 0x7ffeda89bd7c

但是当我注释掉 ~Foo() 函数的时候:

#include <iostream>
using namespace std;
class Foo
{

public:
    int a = 0;
    Foo()
    {
        cout << "ctor: " << this << endl;
    }
    // ~Foo() {
    //    cout << "dtor: " << this << endl;
    // }
};

Foo f()
{
    Foo foo;
    cout << "f " << &foo << endl;
    return foo;
}
void ff(Foo &&ffoo)
{
    cout << "ff " << &ffoo << endl;

}
int main()
{
    ff(f());
    std::cout << "Hello World!\n";
}

输出就变成了这样:

ctor: 0x7fffd5c8bf4c
f 0x7fffd5c8bf4c
ff 0x7fffd5c8bf6c
Hello World!

为什么 ffoo 的地址和 f不一样了呢? 求解答。

compile cmd is:

g++ tmp.cpp 
g++ --version
g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
###

你这个问题涉及到编译器层面了,首先确认一点,这个代码在 Windows 下运行,跟 Linux 下的结果并不一致,在 Windows 下运行,即使带析构函数,其结果也是不一样的,如下:

ctor: 00D8F350
f 00D8F350
dtor: 00D8F350
ff 00D8F51C
dtor: 00D8F51C
Hello World!

这说明你的这个问题其实是编译器的差异所导致,正常来说

Foo f()
{
    Foo foo;
    cout << "f " << &foo << endl;
    return foo;
}

你在 f() 函数里面定义的 foo 变量是声明在局部堆栈里面,即便编译器帮你优化,也不应该直接返回局部堆栈里面的东西,因为函数返回后堆栈指针就调平了,类似 move 这样的优化只是让你少调用一次构造而已,但数据仍然要做拷贝的。
但 g++ 能让局部堆栈里面的东西在函数返回后也能继续使用,那就是g++编译器的优化技术牛X了,但这东西是不能当作标准来使用的。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器