语言C证据
cp-alloca-hot — 测量的堆栈增长,仍然提示
状态
提示。实时时钟 JSONL:cp-alloca-hot.jsonl。该文件是计时伴随文件。通过的测量如下堆栈覆盖。未进行语料库分拣。2026-10-22 的语料库裁定不涵盖此部分。在循环体中的 VLA 未匹配。
测量
clang 21.0.0,-std=c11 -O2。双方每次迭代写入两个字节,并保持一个易变累加器。前一方在每次循环中调用 alloca(64) 并保留第一个和最后一个块的地址,因此这些块会一直存在直到函数返回。Cover 是从最低字节到最高字节之后一个字节的距离。
| 角色 | 案例 | 堆栈字节 | 操作 |
|---|---|---|---|
| 之后 | 一个缓冲区 | 64 | 20000 |
| 之前 | 每次迭代 alloca | 1280000 | 20000 |
相同触摸的挂钟,那 20000 次迭代循环的 80 次调用。之后的时间不是零。比例约为 1。
| 角色 | 情况 | 中位数毫秒 | 操作次数 | 比率 |
|---|---|---|---|---|
| 之后 | one_buffer | 0.295 | 1600000 | 1 |
| 之前 | alloca_each_iter | 0.293 | 1600000 | 0.993 |
这不是一般的加速。提示存在的原因是每次迭代都会增加另一个64字节的块。在栈已经驻留后,重用一个缓冲区并没有使两个字节的访问更快。
在一个 2000 次迭代的循环中,一个 64 字节的 VLA 占用了 64 字节。该槽被重复使用,因此该模式没有被匹配。
解阻条件
不要仅从这个文件将默认值设置为 error。如果每个块必须在函数返回之前保持活跃,一个缓冲区的重写是错误的,栈仍然会增长。在进行任何默认更改之前,仍然需要对语料库进行分类。