std::unique_ptr 同样是 C++11
中引入的,用于表示对动态分配对象的独占所有权(Exclusive
Ownership)。
std::unique_ptr:独占所有权的轻量级管理者
与 shared_ptr 的“共享”理念完全相反,unique_ptr
遵循“独裁”模式:在任何时刻,只能有一个 unique_ptr
指向并拥有一个给定的对象。当这个 unique...
std::shared_ptr:共享所有权的管理者
std::shared_ptr 是一种拥有共享所有权的智能指针。这意味着多个
shared_ptr
实例可以共同拥有和管理同一个动态分配的对象。当最后一个指向该对象的
shared_ptr 被销毁或重置时,该对象会被自动释放。
核心理念:引用计数
shared_ptr 的核心机制是引用计数(Reference
Counting...
模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅优化运行期的性能。
外部模板
外部模板(extern template)
是一种向编译器发出的指令,用于阻止编译器在当前翻译单元(也就是当前的
.cpp
文件)中隐式地实例化一个模板。它告诉编译器:“不必在此处生成这个模板的完整代码,我向你保证,它的代码会在其他某个地方被生成,...
PIMPL (Pointer to Implementation) - 指向实现的指针,
也被称为“编译防火墙 (Compilation Firewall)”或“不透明指针 (Opaque
Pointer)”。它的核心思想是将类的私有成员和私有方法从头文件中完全移除,放到一个独立的、只在
.cpp
文件中定义的实现类(Impl)中。头文件里只保留一个指向该实现类的指针。
通过将类的...
函数参数反序入栈,也称为从右至左参数压栈,指的是在调用一个函数时,传递给该函数的参数不是按照代码中从左到右的顺序,而是从右到左的顺序依次被推入(push)到程序的调用栈(Call
Stack)中。
这是一种由调用约定(Calling
Convention)规定的行为。最常见的采用这种方式的调用约定是
cdecl,它是 C 和 C++ 程序在 x86
上的默认调用约定。
为什么需要...
我们之前讨论的可靠传输、流量控制等,大多是针对点对点
(Point-to-Point)
链路的,即链路上只有两个节点。但在很多网络中,多个节点需要共享同一条通信信道,这种信道被称为广播信道
(Broadcast Channel)。
例如早期的总线型以太网(所有计算机共享一根同轴电缆),现在的无线局域网
Wi-Fi(所有设备共享同一频段的空口)。
在广播信道上,如果两个或两个以上的...
通信基础
要理解物理层的工作原理,我们首先需要掌握一些通信领域的基础理论。
基本概念
数据:是我们想要传送的信息,是信息的载体。可以是数字的(如文本文件)或模拟的(如语音)。
信号:是数据在物理介质上的电气或电磁表现形式。信号是传输数据的方式。
- 数字信号 (Digital
Signal):信号的状态是离散、不连续的,例如只有高、低两种电平。 - 模拟信号
(Analog S...
进程和程序 (Process and
Program)
程序(Program)是一组指令的集合,通常存储在磁盘等静态存储介质上。它本身是静态的、被动的,不占用系统的运行资源(如CPU时间、内存等)。
进程(Process)是程序的一次执行实例。当程序被加载到内存中并开始执行时,就创建了一个进程。它是动态的、活动的,是操作系统资源分配(如内存、文件句柄)和CPU调度的基本单位(更精确的说...
系统调用简介和实现
什么是系统调用(system call)
系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这个特殊接口来获得操作系统内核提供的服务
alt text
系统调用的实现
系统调用是属于操作系统内核的一部分,必须以某种方式提供给进程让它们去调用,相应的操作系统也有不同的运行级别–用户态和内核态,内核态可以毫无限制的访问各...