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

辽宁网站开发北郊网站建设公司

辽宁网站开发,北郊网站建设公司,学校网站风格,中国城乡住建部建设部网站1.左值 (lvalue) 与右值 (rvalue) 1.1 左值 (lvalue) 定义:具有持久身份、可以取地址的表达式。 特点: 有名称的变量或对象可以出现在赋值语句的左侧生命周期通常超出当前表达式可以多次使用 示例: int x 10; // x是左值 int* p …

1.左值 (lvalue) 与右值 (rvalue)

1.1 左值 (lvalue)

定义:具有持久身份、可以取地址的表达式。

特点

  • 有名称的变量或对象
  • 可以出现在赋值语句的左侧
  • 生命周期通常超出当前表达式
  • 可以多次使用

示例

int x = 10;     // x是左值
int* p = &x;    // 可以取地址
x = 20;         // 可以出现在赋值左侧
std::string s = "hello";  // s是左值

1.2 右值 (rvalue)

定义:临时对象或字面量,即将被销毁的值。

特点

  • 通常是临时对象或字面量
  • 不能取地址
  • 只能出现在赋值语句的右侧
  • 生命周期通常仅限于当前表达式

示例

int y = 10 + 20;   // 10+20的结果是右值
std::string("temp");  // 临时string对象是右值
int z = y;         // y是左值,但转换为右值使用

1.3 值类别扩展 (C++11)

C++11 引入了更精细的值类别划分:

       表达式/   \glvalue  rvalue/    \   /    \
lvalue   xvalue   prvalue
  • glvalue (generalized lvalue):有身份的表达式
  • rvalue:可移动的表达式
  • xvalue (eXpiring value):将亡值,可以被移动的资源
  • prvalue (pure rvalue):纯右值,如字面量或临时对象

2.移动语义 (Move Semantics)

2.1 为什么需要移动语义?

传统拷贝语义在处理资源管理类对象时效率低下:

std::vector<int> createVector() 
{std::vector<int> v(1000000);  // 大vectorreturn v;  // 传统C++会进行深拷贝
}

移动语义允许"偷取"临时对象的资源,避免不必要的拷贝。

2.2 移动构造函数与移动赋值运算符

移动构造函数

class MyString 
{
public:// 移动构造函数MyString(MyString&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr;  // 使源对象处于有效但空的状态other.size = 0;}private:char* data;size_t size;
};

移动赋值运算符

MyString& operator=(MyString&& other) noexcept 
{if (this != &other) {delete[] data;        // 释放当前资源data = other.data;    // 窃取资源size = other.size;other.data = nullptr; // 置空源对象other.size = 0;}return *this;
}

2.3 std::move

作用:将左值转换为右值引用,允许移动而非拷贝。

实现原理

template <typename T>
typename std::remove_reference<T>::type&& move(T&& arg) 
{return static_cast<typename std::remove_reference<T>::type&&>(arg);
}

使用示例

std::string str = "Hello";
std::string str2 = std::move(str); 
// str的资源被移动给str2,str现在为空

2.4 移动语义的应用场景

  1. 函数返回值优化 (RVO/NRVO)

    std::vector<int> createVector() 
    {std::vector<int> v;// ...填充数据return v;  // 编译器会自动使用移动语义
    }
    
  2. 容器操作

    std::vector<std::string> vec;
    std::string s = "data";
    vec.push_back(std::move(s));  // 移动而非拷贝
    
  3. 资源管理类

    std::unique_ptr<Resource> p1 = std::make_unique<Resource>();
    std::unique_ptr<Resource> p2 = std::move(p1);  // 转移所有权
    

3.右值引用 (Rvalue Reference)

3.1 基本概念

语法:T&&,只能绑定到右值(临时对象)。

void process(std::string&& s) 
{// s是右值引用,可以安全地移动其资源std::string internal = std::move(s);
}process(std::string("temp"));  // 正确:绑定到右值
std::string str = "hello";
// process(str);  // 错误:不能绑定左值

3.2 与通用引用的区别

T&&在模板参数推导时可能是通用引用:

template <typename T>
void relay(T&& arg) 
{  // 可能是左值或右值引用// ...
}relay(10);      // T&& 绑定到右值
int x = 10;
relay(x);       // T&& 绑定到左值

4.移动语义的注意事项

  1. 被移动后的对象状态

    • 应处于有效但未定义的状态
    • 通常应能安全析构和重新赋值
    std::string s1 = "source";
    std::string s2 = std::move(s1);
    // s1现在为空,但可以安全地:
    s1 = "new value";  // 重新赋值
    
  2. noexcept保证

    • 移动操作通常应标记为noexcept
    • 标准库容器在元素移动操作为noexcept时会优化
  3. 不要过度使用std::move

    • 对基本类型无意义
    • 对已经移动的对象再次移动是未定义行为
    • 在return语句中可能干扰RVO

5.完美转发与移动语义的结合

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) 
{return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}class Resource 
{
public:Resource(int x, const std::string& name);  // 可能接受左值或右值
};auto r = make_unique<Resource>(42, std::string("temp"));
// 完美转发保持参数的值类别

6.性能对比

操作拷贝语义移动语义
100万元素vector传递深拷贝所有元素仅拷贝3个指针(size, capacity, data指针)
大型字符串赋值内存分配+数据复制指针交换
容器重新分配复制所有元素移动所有元素(如果noexcept)

7.最佳实践

  1. 为资源管理类实现移动操作
  2. 移动操作标记为noexcept
  3. 在知道不再需要对象时才使用std::move
  4. 不要返回局部变量的右值引用
  5. 理解编译器何时自动生成移动操作
    • 没有用户声明的拷贝操作
    • 没有用户声明的析构函数
    • 数据成员都可移动

移动语义是现代C++高效资源管理的基础,正确理解和使用可以显著提升程序性能。


文章转载自:

http://VKIVcu3g.jgykx.cn
http://YV7EPKxa.jgykx.cn
http://DHHUEzNh.jgykx.cn
http://zUdYJvtK.jgykx.cn
http://xpTxQbzi.jgykx.cn
http://Z92sggWR.jgykx.cn
http://sTGFILKY.jgykx.cn
http://DgnURvxQ.jgykx.cn
http://MgUPvjiO.jgykx.cn
http://UdSFf2Z7.jgykx.cn
http://8RiCWWsd.jgykx.cn
http://SrAAK1dT.jgykx.cn
http://kLm9ErU7.jgykx.cn
http://0FyEz30H.jgykx.cn
http://7gNWjBll.jgykx.cn
http://7aFrmXJq.jgykx.cn
http://IjI1YCty.jgykx.cn
http://SZCMq94k.jgykx.cn
http://sRMKPEG5.jgykx.cn
http://IthWSHRI.jgykx.cn
http://YoEVSLLN.jgykx.cn
http://cM6GOcuk.jgykx.cn
http://SfABRrg6.jgykx.cn
http://oeZyt1c5.jgykx.cn
http://MgIRe2sv.jgykx.cn
http://rWCFzFRa.jgykx.cn
http://p88EsFpv.jgykx.cn
http://eMhTciPH.jgykx.cn
http://tfPak4am.jgykx.cn
http://ivTKu7kH.jgykx.cn
http://www.dtcms.com/wzjs/634349.html

相关文章:

  • 合肥做双语外贸网站四网合一的网站
  • 产业园门户网站建设方案网站前台和后台设计
  • 广州建立网站的公司网站做境外碎片化旅游的网站
  • 辽宁城市建设职业技术学院教育网站没有网站做cpa
  • 114百事通做网站600网站做支付宝和网银接口
  • wordpress快站怎么样自动全屏网站模板
  • 收录网站是什么意思如何开发一款游戏
  • 上海 政务网站建设情况网站建设报价ppt模版
  • 网站建设中颜色的感染力哈尔滨人社app官网
  • 长春做网站好的公司网站建设的功能需求分析
  • 怎样找做淘宝客的网站系统开发方法有哪些
  • 小米路由器mini做网站wordpress首页分辨率
  • 开源网站模板cms北京住房和城乡建设网站
  • 木马科技网站建设企业营销型网站设计
  • 公司网站建设北京长沙网站公司品牌
  • 天津七七一网站建设有限公司怎么样东莞微信网站
  • 没有自己的境外网站怎么做谷歌推广精密模具东莞网站建设
  • 做效果图的网站网站如何兼容大多浏览器
  • 有没有便宜的网站建设ckeditor wordpress
  • 如何自己做加盟网站电商网站搜索引擎怎么做
  • 网站建设服务那一个便宜网站建设路由设置
  • 利用网站宣传腐倡廉建设工作报道wordpress屏蔽连接
  • 河源网站制作国内永久免费的crm系统软件
  • 珠海网站建设多少钱上海头条新闻最新消息
  • 介绍小说的网站模板下载地址国外手机模板网站
  • 做国际网站有用吗时装网站的建设
  • 绵阳网站建设网站建设哈尔滨的网络优化能做么
  • 艺术网站建设东莞开发一个app多少钱
  • 汕头网站建设推广价格wordpress首页展示分类页面
  • 广东省建设厅网站蒙古文门户网站建设督导