xor eax, eax
。 虽然说这需要零时间是不完全正确的,但也不是完全错误的。但是-1呢? 看Godbolt,GCC和MSVC(大概对这些东西都很好)也做同样的事情:
0000000000431004 48 C7 C1 FF FF FF FF mov rcx,0FFFFFFFFFFFFFFFFh
可启发,易于阅读,保证有效。 但是它是最佳的吗? 有什么问题:
000000000043100B 31 C9 xor ecx,ecx
000000000043100D 48 F7 D1 not rcx
这是2个说明而不是1个说明,所以这不是很好。 但是其中一个“不算在内”,也许。 这是5个字节对7,所以这是一场胜利。 查看
timing信息(这是一个非常酷的工具,单击“运行”以查看结果)也不是我的明确赢家,但我显然不是专家。我猜想我感兴趣的标准是:如果海湾合作委员会开发人员正在看一个暗示这种变化的错误,那么响应是“嗯!酷!我们绝对应该这样做”。或“虽然这似乎是一个聪明的主意,但在现实世界中……”
我们已经知道编译器生成代码来分配特定值(没有人可以mov rcx, 0
这是一种更好的方式?
or rcx, -1
是
1字节。也许这比一个
mov
或一对更好?
xor
不会更改任何标志。 not
确实会更改标志,但也会更改标志。我不能说哪一个会更好,但是
mov
似乎是字节中最短的。