C++ 技术笔记
七月 18, 2025 [cpp] #cpp #memory #template #singleton #naming #securityC++ 技术笔记
内存分配器概览
Linux 下常见的 malloc 实现:
- ptmalloc — glibc 默认分配器,基于 arena 的多线程优化
- tcmalloc — Google 开发,线程本地缓存,小对象分配极快
- mimalloc — Microsoft 出品,性能优于 tcmalloc 和 jemalloc
- jemalloc — FreeBSD 默认,广泛应用于高性能服务
C++ 可通过自定义 allocator 替换底层分配策略。
动态库中的单例问题
在动态库中使用单例时可能产生多个实例,根因是符号隔离:
- 头文件中定义的静态局部变量,每个
.so各自生成一份 - 模板单例在不同动态库中独立实例化
解决方案:将单例实例的定义放到 .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 是类型还是静态成员变量。在模板参数声明中 typename 和 class 等价,但在嵌套从属名称消歧义时只能用 typename。
CFI 与 endbr64 指令
**CFI(Control Flow Integrity)**是一种防御控制流劫持的机制。攻击手段演进:
- 代码注入 → DEP(数据执行保护)
- 代码重用(ROP/JOP)→ CFI
Intel CET 提供硬件级 CFI,包含两部分:
- Shadow Stack:追踪返回地址
- Indirect Branch Tracking:
endbr64指令是其组成部分
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 |
常用缩写
| 缩写 | 全称 |
|---|---|
| COW | Copy on Write |
| CAS | Compare and Swap |
| SFINAE | Substitution Failure Is Not an Error |
| RAII | Resource Acquisition Is Initialization |
| RTTI | Runtime Type Information |
| CRTP | Curiously Recurring Template Pattern |
| PIMPL | Pointer to Implementation |
| SSO | Small String Optimization |
| EBO | Empty Base Optimization |
| GOT/PLT | Global Offset Table / Procedure Linkage Table |
| UAF | Use After Free |