Songqian Li's Blog

去历史上留点故事

格式化输出的执行顺序

由于 C 语言参数压栈顺序是从右往左,所以 printf 和 cout 函数在执行时是从右往左读入缓冲区,然后从左往右输出。

右值引用和左值引用

C++一共有三种基本值类型: 左值(lvalue), 纯右值(prvalue), 亡值(xvalue);
另外还有两种混合值类型: 泛左值(glvalue),右值(rvalue);
左值(lvalue)简单理解就是可以出现在=的左边,所以是可以被赋值的值;
右值(rvalue)类似理解是只可以出现在=的右边,所以是不可以被赋值的值;
左值(lvalue) = {泛左值(glvalue)} - {亡值(xvalue)};
右值(rvalue) = {亡值(xvalue)} ∪ {纯右值(prvalue)};
std::move 的作用是返回一个亡值(xvalue);

右值引用是 C++11 中引入的新特性 , 它实现了转移语义和精确传递。它的主要目的有两个方面:

  1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
  2. 能够更简洁明确地定义泛型函数。

左值和右值的概念:
左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。
右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。

右值引用和左值引用的区别:

  1. 左值可以寻址,而右值不可以。
  2. 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
  3. 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。
    左值引用与右值引用
    [c++11]我理解的右值引用、移动语义和完美转发
相关文章
评论
分享
  • 右值引用

    本文整理自《modeln C++ Tutorial:C++11/14/17/20》 右值引用是 C11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C 中大 量的历史遗留问题,消除了诸如 std::vecto...

    右值引用
  • 为什么Proactor比Reactor模式更优?

    首先,我们先了解一下什么是 Reactor 模式和 Proactor 模式。 什么是 Reactor 模式和 Proactor 模式? Reactor 模式 Reactor 模式是指主线程负责监听和分发事件,工作线程负责 I/O ...

    为什么Proactor比Reactor模式更优?
  • 循序渐进实现C++的单例模式

    注:本文引自:https://guodong.plus/2020/0529-002048/ v1.0——基本实现 12345678910111213class Singleton { public: static S...

    循序渐进实现C++的单例模式
  • 《操作系统真象还原》:第十章 输入输出系统

    上一章中我们遇到的字符混乱和 GP 异常问题,根本原因是由于临界区代码的资源竞争,这需要一些互斥的方法来保证操作的原子性。 10.1 同步机制——锁 10.1.1 排查 GP 异常,理解原子操作 多线程执行刷屏时光标值越界导致...

    《操作系统真象还原》:第十章 输入输出系统
  • 《操作系统真象还原》:第九章 线程

    线程和进程将分两部分实现,本章先讲解线程。 9.1 实现内核线程 9.1.1 执行流 在处理器数量不变的情况下,多任务操作系统采用多道程序设计的方式,使处理器在所有任务之间来回切换,这称为“伪并行”,由操作系统中的任务调度器决定当...

    《操作系统真象还原》:第九章 线程
  • GPU虚拟化

    用户层虚拟化 本地 API 拦截和 API formwarding 在用户态实现一个函数库,假设叫 libwrapper, 它要实现底层库的所有 API; 让 APP 调用这个 libwrapper。如何做? libwrap...

    GPU虚拟化
  • 硬件虚拟化

    硬件虚拟化介绍 硬件虚拟化要做的事情 体系结构支持 体系结构 实现功能 作用 模式切换 Host CPU <-> Guest CPU 切换 CPU 资源隔离 二阶段地址转换 GVA-> GPA...

    硬件虚拟化
  • 《操作系统真象还原》:第八章 内存管理系统

    8.1 makefile 简介 这部分可参考阮一峰的讲解:https://www.ruanyifeng.com/blog/2015/02/make.html 8.1.1 makefile 是什么 makefile 是 Linu...

    《操作系统真象还原》:第八章 内存管理系统
  • 《操作系统真象还原》:第七章 中断

    7.1 中断是什么,为什么要有中断 运用中断能够显著提升并发,从而大幅提升效率。 7.2 操作系统是中断驱动的 略 7.3 中断分类 把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部...

    《操作系统真象还原》:第七章 中断
  • 《操作系统真象还原》:第六章 完善内核

    6.1 函数调用约定简介 咱们实验使用cdecl。这里提一下stdcall,cdecl与stdcall的区别在于由谁来回收栈空间。 stdcall是被调用者清理参数所占的栈空间。 举例来说: 12int subtract(int ...

    《操作系统真象还原》:第六章 完善内核