C 语言与汇编、性能剖析衔接
更新时间:2026-08-25。本文是
languages/c/主题专家层第 3 篇,也是 C 语言主题的收束篇。前面讲了语法、指针、内存、编译,本文把它们串起来——用汇编和 perf,把"C 代码"和"性能数据"直接对上,完成 C 语言到性能剖析主线的闭环。
本文要回答的问题
- 怎么把 C 代码变成汇编看?
gcc -S和objdump -d区别? -O0和-O2生成的代码差在哪?为什么本站 demo 默认-O0 -g?- perf 火焰图上的热点,怎么对应回 C 源码的某一行?
一、看汇编的三种方式
| 方式 | 命令 | 特点 |
|---|---|---|
| 编译输出汇编 | gcc -S foo.c -o foo.s | 看编译器生成的汇编,可读性好 |
| 反汇编目标文件 | objdump -d foo.o | 看 .o 里的机器码反汇编 |
| 反汇编可执行文件 | objdump -d ./app | 看链接后的最终代码 |
gcc -S -O0 add.c -o add.s # 生成汇编(-O0 最直白)
cat add.s # 查看二、-O0 与 -O2 的代码差异(本站核心教学点)
用一个累加循环对比:
// demo.c
int sum_to(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}2.1 -O0(无优化,直白)
sum_to:
push %rbp
mov %rsp, %rbp
mov %edi, -20(%rbp) ; n 存局部
movl $0, -4(%rbp) ; sum = 0
movl $1, -8(%rbp) ; i = 1
.L2:
mov -8(%rbp), %eax
cmp -20(%rbp), %eax ; i <= n ?
jg .L3
mov -8(%rbp), %eax
add %eax, -4(%rbp) ; sum += i
addl $1, -8(%rbp) ; i++
jmp .L2
.L3:
mov -4(%rbp), %eax ; return sum
pop %rbp
ret-O0 把每行 C 都"忠实"翻译成对应汇编——局部变量都在栈上、循环有显式的比较和跳转。这就是本站 demo 默认 -O0 的原因:让 perf 能定位到具体行、让读者看清代码和指令的对应关系。
2.2 -O2(优化后,可能"消失")
sum_to:
lea -1(%rdi), %eax ; eax = n - 1
... ; 用等差数列求和公式,循环被消除
ret编译器识别出这是等差数列求和,直接用公式 n*(n+1)/2 替代循环——循环整个消失了!这就是 demos/cpu-demo 里 make release(-O2)演示的教学点:优化器能消除用户态热循环。
三、内联汇编简介
C 里可以嵌入汇编(asm 关键字),用于需要精确控制指令的场景:
static inline uint64_t rdtsc(void) {
unsigned int lo, hi;
asm volatile ("rdtsc" : "=a"(lo), "=d"(hi));
return ((uint64_t)hi << 32) | lo;
}rdtsc 读取 CPU 时间戳计数器,常用于精确计时(性能基准测试)。内联汇编语法复杂、可移植性差,只在确有必要时用。
四、perf 热点定位实战
4.1 完整流程
# 1. 编译(保留符号 -g,关优化 -O0 便于定位)
gcc -O0 -g demo.c -o demo
# 2. 采样
perf record -g ./demo # -g 记录调用栈
# 3. 看报告
perf report # 交互式看热点函数4.2 火焰图
perf record -g ./demo
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg火焰图里越靠上的函数是调用栈越深的位置,宽度代表采样占比。把热点函数和 C 源码对上,就完成了"性能数据 → 源码"的闭环。
完整流程见 perf 使用指南。
4.3 从热点到源码行
perf report # 看到热点函数 sum_to 占 80%
perf annotate sum_to # 反汇编该函数,看哪条指令最热结合 -g 的行号信息,能精确定位到"sum += i 这一行最热"。
五、C 语言 → 性能剖析主线的完整闭环

这就是本站 concepts/(原理)+ tools/(工具)+ languages/c/(语言)三者的交汇点:C 语言提供了"看得懂底层"的能力,perf 提供了"看得见性能"的手段。
六、与本站主线衔接
- perf 工具:采样、火焰图、反汇编的完整操作,见 perf 使用指南。
- 编译器优化:
-O0/-O2/-O3对代码的影响,见 L4 编译器选项。 - 汇编与 CPU:流水线、乱序执行,见 L4 CPU 微架构。
- 基准测试:rdtsc 计时与基准测试方法,见 基准测试方法论。
一句话总结
汇编与性能衔接 = 用 gcc -S/objdump 看汇编、理解 -O0 忠实 vs -O2 优化(甚至消除循环)、再用 perf 火焰图把热点定位回源码行;这是 C 语言主题的收束——从"会写 C"到"看懂 C 的性能"。