掌握C++右值引用的十大要点:如何正确处理纯右值和将亡值

最近由于工作需要,我阅读了很多关于 C++右值方面的材料。在 C++中,右值是一个非常重 要的概念,它对于理解 C++的内部机制和实现高效代码至关重要。本文将总结了 10 个关于 右值的实践经验。 C++右值有两种:纯右值、将亡值。右值引用可以延长将亡值的生命周期,使得将亡值 能够被正常使用,而不会被错误地释放。 右值引用的一个作用是延长右值的生命周期。右值引用可以延长将亡值的生命周期,使 得将亡值能够被正常使用,而不会被错误地释放。 临时对象作为右值处理。这种对象往往会在一些表达式中自动创建,然后被立即使用。 使用右值引用来绑定临时对象,可以让程序更高效地处理这些对象,避免了不必要的内 存拷贝操作。 移动构造函数尽可绑定右值非常量。这是因为右值非常量可以被修改,而右值常量则不 能。移动构造函数会破坏源对象,所以只有右值非常量才能被移动构造函数绑定。 对于一个右值对象,允许调用成员函数。这与左值对象类似。但需要注意的是,对于一 个将亡值,如果其生命周期结束,那么调用其成员函数可能会导致程序出现未定义行 为。 右值可以被修改(这也说明了其可以被破坏)。因此,在使用右值时需要谨慎处理,以 避免因为修改了右值而导致程序出现问题。 右值不能当作左值使用,左值可以当作右值使用。这是因为左值具有实际地址,并且与 右值有同样地表现。 常量左值引用可以绑定到右值。这种引用可以避免将右值对象修改的风险,同时还可以 延长右值的生命周期,使其能够被正常使用。 返回右值引用的函数在几乎所有情况下是糟糕的。因为返回右值引用往往会导致右值的 生命周期延长,从而使其可能被错误地使用。对于返回右值的函数,建议使用值返回的 方式。 在大部分情况下 return 中使用是 std::move 并不会将事情变得更好,相反该操作会 阻止编译器进行返回值优化。

2021年9月30日

UNIX伪终端

介绍 最近在研究有关 UNIX 的相关理论知识,在此记录相关重要概念备忘。 概述 伪终端是指,对于一个应用程序而言,它看似一个终端,但事实上它并不是一个真正的终 端。 通常一个进程打开伪终端主设备,调用 fork。子进程建立一个新的会话,打开一个相 应的伪终端从设备,将其文件描述符复制到标准输入输出错误,然后调用 exec。伪终端从 设备称为子进程的控制终端。 看起来像一个双向管道,从设备上的终端行规程使得我 们拥有普通管道没有的其他处理能力。 伪终端的典型用途 网络登录服务器 最典型的例子是 telnetd 和 rlogind 服务器。 在 rlogind 服务器和登录 shell 之间有 两个 exec 调用,这是因为 login 程序通常在两个 exec 之间检验用户是否合法。 窗口系统终端模拟 终端模拟器最为 shell 和窗口管理器之间的媒介。每个 shell 在自己的窗口中执行。 shell 将自己的标准输入、标准输出、标准错误连接到 PTY 的从设备端。 script 程序 script 程序将终端会话期间的所有输入和输出信息复制到一个文件中。 使用 script 的不 足是必须处理文件中的控制字符。 expect 程序 在非交互模式中驱动交互模式运行。 运行协同进程 当通过管道与协同进程通信时,标准 I/O 库会完全缓冲标准输入和标准输出,从而引起死 锁。 现在协同进程的标准输入和标准输出就像终端设备一样,所以标准 I/O 库会将这两个 流设置为行缓冲。 观看长时间运行程序的输出 由于重定向到文件时,标准 I/O 库将完全缓冲它的标准输出。 打开伪终端设备 PTY 表现得就像物理终端设备一样,因此应用程序就无需在意它们在使用的是何种设备。 在伪设备可用之前,它的权限必须设置,以便应用程序可以访问它。 ...

2021年2月10日

UNIX 终端I/O

介绍 我阅读并且学习了有关于 UNIX 系统终端 I/O 相关的内容。在此记录一些比较关键的概 念。 引论 终端 I/O 十分复杂,原因之一是它应用于许多事物。 综述 终端 I/O 的两种工作模式:规范模式输入处理(默认)、非规范模式输入处理。 规范模式下,对于每一个读请求,终端驱动程序最多返回一行。 可以认为终端设备是由内核中的终端驱动程序控制的,每一个终端设备都有一个输入队列和 一个输出队列。 开启回显功能时,在输入队列和输出队列之间有一个隐含连接。 输入队列长度是有限值。 输出队列虽然也有限,但是程序并不能获取这个值。在输出队列要填满时,内核会直接将写 进程休眠。 大多是 UNIX 系统在一个称为终端行规程的模块中进行全部的规范处理。该模块在内核通用 读写函数和实际设备驱动程序之间。 所有可以检测和更改的终端设备特性都包含在 termios 结构中。 使用 tcsetattr 和 tcgetattr 可以设置终端选项进而控制终端。 特殊输入字符 POSIX 定义了 11 个在输入时要特殊处理的字符。在这 11 个特殊字符中,9 个字符的值可 以任意更改。 为了更改特殊字符,需要修改 termios 结构中的 c_cc 数组的相应项。 POSIX 允许禁止使用这些字符。 终端标识 在大多数 UNIX 系统版本中,控制终端名字一直是/dev/tty。 规范模式与非规范模式 规范模式:发送一个请求,当一行已经输入以后,终端程序立即返回。以下几个条件造成读 返回: 所请求的字节数已经读到时,无需读一个完整的行。 当读到一个行界定符号 捕捉到信号,并且该函数不再自动重启 非规范模式:时输入数据不装配成行,不处理特殊字符。当读取指定量的数据后,或者超过 指定量的时间后,通知系统返回。该模式下没有关闭对信号的处理,用户始终可以键入一个 触发终端产生信号的字符。 终端窗口大小 大多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的方法,当窗口大小变化的时候,使 内核通知前台进程组。内核未每个终端和伪终端都维护了一个 winsize 结构。 ...

2021年2月10日