2

http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly的 29 分钟标记处, Andrei Alexandrescu 说使用常量时更喜欢 0 并提到硬件知道如何处理它。我做了一些组装,我知道他在说什么以及 CPU 上的零标志

然后他说更喜欢常数 1 而不是 -1。-1 IIRC 实际上并不特殊,但因为它是负数,所以会设置 CPU 上的符号标志。根据我目前的理解,1 只是一个正数,处理器标志上没有任何位,也无法与 0 或其他正数区分开来。

但安德烈说更喜欢 1 而不是 -1。为什么?1 比 -1 更好的硬件有什么作用?

4

1 回答 1

0

首先,应该注意的是 Andrea Alexandrescu 强调了零和其他两个好的常数之间的差异,使用一个和负一之间的差异不太显着。他还将编译器问题与硬件问题捆绑在一起,即硬件可能能够有效地执行操作,但编译器不会生成适当的机器代码,因为在选择的高级语言中给出了相当清晰的表达式。

虽然我无法读懂他的想法,但至少有两个方面可以使一个方面比消极方面更好。

  1. 许多 ISA 提供返回零或一(例如,MIPS 在小于时设置)而不是零或负一的比较操作(或标志到 GPR 传输)。(SIMD 指令是一个例外;SIMD 比较通常生成零或负一 [所有位设置]。)
  2. 至少一种 SPARC 实现使加载较小的有符号值更加昂贵,而且我似乎记得至少有一个 ISA 没有提供加载有符号字节的指令。符号扩展的简单实现增加了延迟,因为在加载值之前不知道是设置还是清除更高的有效位。

负数确实有一些好处。正如您所提到的,测试负值通常相对容易,因此如果负值是唯一使用的负值,则处理它的成本可能会更低。此外,有条件地清除基于零或负一的值只是一种and操作。(对于有条件地设置或清除单个位,一个而不是负一个将是首选,因为这将只涉及移位和一个and。)

于 2014-04-20T01:55:23.113 回答