笔记杂项(note 目录图文存档)
一月 05, 2024 [C/C++] #obsidian #笔记 #编译链接 #并发 #网络 #杂项笔记杂项(note 目录图文存档)
obsidian 笔记库 note/ 目录遗留的 6 张截图,统一收录在本页并附文字转录。各图在专题文章中另有归属(处理决策见迁移说明),本页保证内容自洽、可独立检索。
gem5 场景下各链接器链接耗时对比
原文结论:在 gem5 场景下推荐使用 mold 链接器;链接器的选择对构建耗时的影响比存储位置(NFS vs 本地 SSD)更显著。

文字转录(时间为 mm:ss 格式):
| 链接器 | NFS + all m5 | NFS + last few | Local SSD + all m5 | Local SSD + last few | Local SSD + -j48 + last few |
|---|---|---|---|---|---|
| ld | — | 3:29.19 | — | 3:08.31 | 3:00.15 |
| bfd | 4:15.82 | 3:32.13 | 3:39.70 | 3:02.15 | 3:02.35 |
| lld | 2:16.22 | 1:54.25 | 1:52.94 | 1:13.12 | 1:13.16 |
| gold | 2:30.98 | 1:43.59 | 1:59.41 | 1:19.86 | 1:19.48 |
| mold | 1:48.62 | 1:07.08 | 1:08.18 | 0:28.23 | 0:27.89 |
要点:mold 比 ld 快约 6 倍(Local SSD + -j48 场景 3:00 → 0:28);本地 SSD 相比 NFS 带来约 2 倍提升;并行(-j48)对 mold 收益明显。
gcc -Wl,-Bstatic / -Bdynamic 混合链接
gcc 通过 -Wl 向链接器 ld 传参:-Bstatic 强制其后的库按静态链接,-Bdynamic 强制按动态链接。部分静态、部分动态链接的写法:
# 静态链接 libA.a,同时动态链接 libB.so
gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ...
规则要点:
- 链接方式标记影响其后所有的
-l库,直到出现下一个标记为止。例如... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ... -lC中,libC没有跟随标记,将按默认方式(动态)链接; - 前提是
-L搜索路径中能找到对应版本的库; - 不指定任何标记时,
gcc默认优先动态链接:若同时存在libc.so与libc.a,会链接.so。
截图与英文原文讨论见 Telling gcc directly to link a library statically。
C++ 六种 memory_order 内存序
C++11 <atomic> 中 memory_order 枚举的六个值及定义规则:
| 枚举值 | 定义规则 |
|---|---|
memory_order_relaxed | 不对执行顺序做任何保证 |
memory_order_consume | 本线程中,所有后续的有关本原子类型的操作,必须在本条原子操作完成之后执行 |
memory_order_acquire | 本线程中,所有后续的读操作必须在本条原子操作完成后执行 |
memory_order_release | 本线程中,所有之前的写操作完成后才能执行本条原子操作 |
memory_order_acq_rel | 同时包含 memory_order_acquire 和 memory_order_release 标记 |
memory_order_seq_cst | 全部存取都按顺序执行 |
要点:acquire/release 是最常用、最重要的组合,理解它们后其余内存序才好理解;consume 在实践中普遍被实现为 acquire(C++17 起建议暂时弃用);需要全局顺序一致时用 seq_cst。
延伸阅读:线程安全、原子变量、内存顺序、内存顺序 Memory Order。
x86-64 通用寄存器与 Caller/Callee Save
x86-64 共 16 个 64 位通用寄存器,用途与保存责任(System V AMD64 ABI):
| 寄存器 | Callee Save | 用途 |
|---|---|---|
%rax | 返回值寄存器;idiv/imul 也使用 | |
%rbx | yes | 通用寄存器 |
%rcx | 第 4 参数寄存器 | |
%rdx | 第 3 参数寄存器;idiv/imul 也使用 | |
%rsp | yes | 栈指针 |
%rbp | yes | 帧指针 |
%rsi | 第 2 参数寄存器 | |
%rdi | 第 1 参数寄存器 | |
%r8 | 第 5 参数寄存器 | |
%r9 | 第 6 参数寄存器 | |
%r10 | 通用寄存器 | |
%r11 | 通用寄存器 | |
%r12~%r15 | yes | 通用寄存器 |
要点:
%rax存函数返回值;imul两个 64 位相乘最多产生 128 位结果,需要%rax与%rdx共同存储,idiv的 128 位被除数同理;%rsp指向栈顶,push/pop通过改变%rsp实现进栈出栈;%rbp标识当前栈帧起始位置;%rdi、%rsi、%rdx、%rcx、%r8、%r9依次传递前 6 个整型参数;- Caller Save 与 Callee Save 的区别:标记为 Caller Save 的寄存器,调用方在发起调用前负责压栈保存;标记为 Callee Save 的寄存器,被调用方若要覆盖,必须先保存、返回前恢复,调用方可放心跨调用持有其值。
截图出处与上下文:实现一个简单的 CRT(issue24 系列合集)。
三种多态与 Ad-hoc 多态
《Rust 编程之道》提到三种多态形式:
- 参数化多态(Parametric polymorphism):同一代码作用于任意类型,行为一致,对应 Rust 的泛型;
- Ad-hoc 多态(Ad-hoc polymorphism):同一函数名针对不同类型有不同实现,按调用时的类型选择,对应 Rust 的 trait(及 C++ 的重载/特化);
- 子类型多态(Subtype polymorphism):子类型实例可用于任何需要父类型的位置,对应 trait 对象(
dyn Trait)/继承体系。
"Ad hoc" 是拉丁语常用短语,意为"特设的、特定目的的、即席的、临时的、将就的、专案的",形容为某个特定问题、任务而专门设定的东西。中文直译"特设多态"很少见,书籍多保留原文,因此这个概念初见时容易困惑。
相关讨论见泛型特化 Specialization(特化即 Ad-hoc 多态范畴内的按类型定制)。
Linux 网络监控命令速查(按 OSI 分层)

文字转录:
| 层 | 命令 | 用途 |
|---|---|---|
| L4 传输层 | ss / netstat | tcp/udp 连接统计 |
iperf | 测量瓶颈带宽 | |
netperf | 测量带宽/延迟 | |
nc | 读写网络连接 | |
tcptrack | 排查 TCP 专项问题 | |
lsof | 查看 tcp/udp 的进程占用 | |
ngrep | 按四层过滤分析载荷 | |
| L3 网络层 | traceroute | 发现到目标主机的路由路径 |
ping | 测试 IP 层连通性 | |
mtr | traceroute 与 ping 的结合 | |
iftop | 测量 IP 层吞吐 | |
ip addr | 查看三层配置 | |
ip -s route | 查看路由规则与统计 | |
nethogs | 按进程监控带宽占用 | |
| L2 数据链路层 | ip -s link | 链路状态与 rx/tx/err 统计 |
arp | 查看 arp 表与邻居信息 | |
ethtool | 链路状态、速率与网卡设置 | |
brctl | 查看 linux 网桥 fdb/stp 状态 | |
iwconfig / iwlist | 无线链路状态 / 扫描可用无线网络 | |
| 抓包与分析 | tcpdump / tshark | 抓包并分析二/三/四层头部 |
| Wireshark | tcpdump/tshark 的图形界面版 | |
nmap | 远程主机扫描,发现二/三/四层信息与服务 | |
| OpenVAS | 具备扫描发现能力的漏洞扫描器 | |
| EtherApe | 图形化网络监控(link/IP/TCP 模式) |
出处与使用场景见笔记:Linux 性能监视与跑分测试。