当前位置: 首页 > news >正文

淘宝网发布网站建设温州seo网站建设

淘宝网发布网站建设,温州seo网站建设,南皮县网站建设公司,建站源码程序右值引用与移动语义右值引用 &&左值(Lvalue):有名字,可取地址,生命周期可持续。右值(Rvalue):临时对象,不可取地址,生命周期短,例如字面量…

右值引用与移动语义

右值引用 &&

左值(Lvalue):有名字,可取地址,生命周期可持续。

右值(Rvalue):临时对象,不可取地址,生命周期短,例如字面量、返回值等。

int a = 10;     // a 是左值

int b = a + 1;  // a + 1 是右值(临时值)

为什么要有右值引用?

只有左值引用(T&),没有右值引用(T&&)。导致一个问题:无法区分一个值是“即将销毁的临时变量”还是“正在使用的对象”。

右值引用的存在,是为了优化性能,避免不必要的拷贝

std::move 与 std::forward

std::move 并不真正进行“移动”,它只是一个类型转换工具,把一个变量强制转换为右值引用,从而允许“移动语义”生效。

std::move 的作用是告诉编译器:“我不再使用这个变量了,你可以把资源搬走。”

搭配右值引用,触发移动构造/移动赋值,避免不必要的拷贝。

示例:

#include<iostream>

#include<string>

class Myclass

{

    public:

    std::string data;

    Myclass(std::string& other):data(other)

    {

        std::cout<<"拷贝!"<<std::endl;

    };

    Myclass(std::string&& other):data(std::move(other))

    {

        std::cout<<"移动赋值!"<<std::endl;

    };

};

int main()

{

    std::string str{"Hello"};

    Myclass a(str);

    Myclass b = std::move(str);

    std::cout << std::endl;

    return 0;

}

std::forward:

std::forward 会根据模板参数 T 的类型,把参数转回它原来的值类别。

原理;本质就是一个 条件版的 static_cast

template<typename T>

T&& forward(typename remove_reference<T>::type& t) noexcept {

    return static_cast<T&&>(t);

}

如果 T int&(表示原来传的是左值),T&& 折叠成 int& 返回左值。

如果 T int(表示原来传的是右值),T&& 还是 int&& 返回右值。

特性

std::move

std::forward

作用

无条件把值变右值

条件保留原值类别

使用场景

想强制触发移动语义

模板中做完美转发

是否会改变左值

会变右值

不会

常见位置

普通函数内部

模板函数内部(配合 T&&)

注:std::move = “全部改成右值 std::forward = “保留原来的左/右值身份”

移动构造函数、移动赋值运算符

传统的拷贝构造函数和拷贝赋值运算符通过深拷贝(复制数据)实现对象复制,效率较低,尤其是涉及动态资源(如堆内存、文件句柄等)时。移动构造函数和移动赋值运算符的引入,允许“窃取”临时对象的资源,避免不必要的拷贝,提高程序性能。移动赋值 就是直接把旧房子的门钥匙交给你(直接接管资源),完全不用搬东西。

移动构造函数:

语法:ClassName(ClassName&& other) noexcept;

参数类型是右值引用(ClassName&&)。

noexcept 表示此函数不会抛异常

功能:

将 other 对象内部的资源(如指针)直接转移给新对象。

将 other 的资源指针置空或重置,避免双重释放。

示例:

class MyMC

{

    public:

    std::string data;

    MyMC(const std::string& str):data(str){};

    ~MyMC(){};

//移动构造函数

    MyMC(MyMC&& other):data(other.data){};

};

移动赋值运算符:同样接收右值引用参数

功能:先释放当前对象的资源(防止内存泄漏)、将 other 的资源指针接管、将 other 的资源指针置空。

语法:ClassName& operator=(ClassName&& other) noexcept;

MyMC& operator=(MyMC&& other) noexcept //重载移动赋值运算符

    {

        return *this;

    }

完美转发(perfect forwarding)

完美转发 是指在模板函数中,将接收到的参数 原封不动(保持它的左值/右值属性) 转发给另一个函数。如果你传进来的是左值,它会被当成左值转发;如果你传进来的是右值,它会被当成右值转发。

为什么需要完美转发?

模板参数 T 按值接收时,会把右值变成左值

转发引用:

template<typename T>

void func(T&& arg) { ... }

如果这种 T&& 出现在模板参数里,并且 T 要从函数参数类型推导出来,它不是普通右值引用,而是 转发引用

如果传进来是左值 T 推导成 T& 参数类型变成 T& && 折叠成 T&(左值引用)。

如果传进来是右值 T 推导成 T 参数类型是 T&&(右值引用)。

具体规则;

T& &  T&

T& && T&

T&& & T&

T&& && T&&

示例:

#include<iostream>

#include<string>

void process(int& x)

{

    std::cout<<"左值版本\n";

}

void process(int&& x)

{

    std::cout<<"右值版本\n";

}

template<typename T>

void wrapper(T&& arg)

{

    process(std::forward(arg));

}

int main()

{

    int a = 5;

    wrapper(a);   // 左值版本

    wrapper(10);  // 右值版本

    return 0;

}

http://www.laogonggong.com/news/620.html

相关文章:

  • 设计师服务平台网站杭州网络推广外包
  • 淘宝客网站主题下载实时热点新闻
  • 网站集约化建设 技术seo优化工作怎么样
  • 可以做网站的编程有什么软件百度知道网页版
  • 游戏网站的监管由谁来做站长工具seo综合查询怎么使用的
  • 企业网站开发公司有哪些网站底部友情链接
  • 仙居住房和城乡建设部网站湖南企业竞价优化首选
  • 买了空间和域名 就有网站后台了吗sem培训机构
  • 专业微网站建设公司首选公司链接网
  • 如何建一个购物网站班级优化大师头像
  • php网站开发技术代码微信推广平台怎么做
  • 微信营销模式北京seo优化排名推广
  • 网易企业邮箱登录入口邮箱谷歌排名优化
  • 长沙网站公司网站建设如何建立网址
  • 温州做网站哪家好磁力链接搜索引擎2021
  • 个人建设任务网站推广软文范例100字
  • 手机网站建设策划方案seo如何去做优化
  • 高密哪里有做网站的企业新闻稿发布平台
  • 河北廊坊百度建站电子商务seo是什么意思
  • 动漫设计就业前景东营优化路网
  • 无锡网站建设专家无锡网站制作长春关键词优化报价
  • 适合毕设做的简单网站如何免费建立一个网站
  • Python做网站 性能百度搜索推广采取
  • 北京食药局网站年检怎么做百度一下了你就知道官网
  • 网站备案网站类型免费游戏推广平台
  • 界面设计好看的网站杭州网站优化咨询
  • 建设银行网站会员用户名格式国内十大4a广告公司
  • 做网站一般哪里找制作一个网站的费用是多少
  • 做3d动画网站高端网站建设报价
  • 网站建设制作设计惠州郑州关键词优化费用