【发布时间】:2012-04-25 00:04:51
【问题描述】:
我只是注意到 Clang 编译了这个语句(当然没有任何优化):
--x; /* int x; */
进入:
addl $4294967295, %ecx ## imm = 0xFFFFFFFF
为什么?使用addl 而不是“显而易见的”subl 有什么好处吗?或者它只是一个实现事实?
让我着迷的是这个:
x -= 1;
变成:
subl $1, %eax
Clang 信息:
Apple clang 3.0 版 (tags/Apple/clang-211.12) (基于 LLVM 3.0svn) 目标:x86_64-apple-darwin11.2.0 线程模型:posix【问题讨论】:
-
这可能只是实现,可能会随着优化级别而改变。更有趣的是它没有使用
dec,这可能是一种优化,因为dec不会改变那么多的状态标志,所以它依赖于之前的指令。 -
gcc 使用
subl为x--和x=-1生成相同的代码。有趣的是,如果我启用-O3,它会使用xorl。 -
没有优势,也没有劣势。两者都是 3 个字节,具有相同的性能特征。
-
@ughoavgfhw:对于现代处理器,
dec的速度要么相同,要么比add/sub慢,因此将其用作优化实际上没有意义(对于速度至少,它可能会在可执行文件大小方面提供好处) -
@ughoavgfhw 在许多处理器上,
dec和inc实际上速度较慢,因为它们只更改状态标志寄存器的 部分,因此在与其他算术运算一起使用。
标签: c assembly compiler-construction x86 clang