You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x64架构下如何高效将64位寄存器设置为-1?

x64架构下将寄存器设为-1的优化方案探讨

如果问题是“x64架构下如何高效将64位寄存器设置为0?”,答案很明确——没人能比得过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  

它用了两条指令而非一条,看起来似乎不如单指令方案,但其中一条指令“几乎没什么成本”,说不定可行。而且它只占5字节,比前者的7字节更短。通过相关时序分析工具查看后,我没看出哪种方案有绝对优势,但显然我不是这方面的专家。

我想知道的是:如果gcc开发者收到建议改用第二种写法的bug报告,他们会回应“哇!好主意,我们马上改”,还是说“这写法确实巧妙,但实际场景里……”?

我们都知道编译器会针对特定值生成优化代码——没人会用mov rcx, 0这种低效写法。虽说-1不像0那样常用,但也不算罕见,要是有更优方案,那确实该做优化。

那第二种写法到底是不是更优的选择?


内容的提问来源于Stack Exchange,提问作者David Wohlferd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:43:12