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

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

九月 30, 2021

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表现得就像物理终端设备一样,因此应用程序就无需在意它们在使用的是何种设备。 在伪设备可用之前,它的权限必须设置,以便应用程序可以访问它。

二月 10, 2021

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结构。

二月 10, 2021