C++ 技术笔记

七月 18, 2025 [cpp] #cpp #memory #template #singleton #naming #security

C++ 技术笔记

内存分配器概览

Linux 下常见的 malloc 实现:

C++ 可通过自定义 allocator 替换底层分配策略。

动态库中的单例问题

在动态库中使用单例时可能产生多个实例,根因是符号隔离:

  1. 头文件中定义的静态局部变量,每个 .so 各自生成一份
  2. 模板单例在不同动态库中独立实例化

解决方案:将单例实例的定义放到 .cpp 源文件中,避免头文件重复生成:

// singleton.cpp
Singleton& Singleton::instance() {
    static Singleton instance;
    return instance;
}

模板推导与 template / typename 关键字

template 消歧义

在模板函数中调用依赖模板参数的成员函数模板时,编译器不会自动推导第二层:

template<class T>
int call(T t) {
    return t.value.template a<int>();  // 必须用 template 关键字
}

template 告诉编译器 a 是一个模板,需要再次推导生成具体符号。

typename 消歧义

在模板内部,依赖于模板参数的类型名称(嵌套从属名称)必须用 typename 声明:

template<typename T>
void fun(const T& proto) {
    typename T::const_iterator it(proto.begin());  // 必须声明为类型
}

没有 typename,编译器无法区分 T::const_iterator 是类型还是静态成员变量。在模板参数声明中 typenameclass 等价,但在嵌套从属名称消歧义时只能用 typename

CFI 与 endbr64 指令

**CFI(Control Flow Integrity)**是一种防御控制流劫持的机制。攻击手段演进:

  1. 代码注入 → DEP(数据执行保护)
  2. 代码重用(ROP/JOP)→ CFI

Intel CET 提供硬件级 CFI,包含两部分:

endbr64 标记间接跳转的有效目标。若 CET 未启用,该指令退化为 NOP,不影响旧处理器。

裸机除零行为

Intel x86 CPU 在裸机(BIOS 环境)执行除法指令时,除零会触发 0 号中断。BIOS 的中断向量表将 0 号中断指向 dummy_iret_handler(地址 f000:ff53),这个处理函数只执行 iret 直接返回,导致 CPU 在除法指令和中断处理之间无限循环。操作系统启动后会重写中断向量表,用自己的异常处理机制接管。

变量与函数命名

常用对立命名

类型命名对
指针prev/next, front/back, head/tail, left/right
状态valid/invalid, empty/full, free/busy, dead/alive
顺序first/second/last, before/after, begin/end
速度fast/slow, early/late
范围low/high, floor/ceil, small/big, above/below
属性odd/even, positive/negative, signed/unsigned
操作send/receive, accept/reject, push/pop, add/remove
架构master/slave, leader/follower, client/server
算法dfs/bfs, recursive/iterative, linear/binary

常用缩写

缩写全称
COWCopy on Write
CASCompare and Swap
SFINAESubstitution Failure Is Not an Error
RAIIResource Acquisition Is Initialization
RTTIRuntime Type Information
CRTPCuriously Recurring Template Pattern
PIMPLPointer to Implementation
SSOSmall String Optimization
EBOEmpty Base Optimization
GOT/PLTGlobal Offset Table / Procedure Linkage Table
UAFUse After Free