与零进行比较的64位整数更快方法

时间:2018-08-25 09:01:50

标签: c compare compiler-optimization

鉴于zero is a special constant,正在寻找更快的方法来检查 x == 0 ...有一些优化方法,并且可以确保编译器进行一些优化?


说明仅用零来充实比较,因为Stackoverflow要求一段代码是有效的问题。

#include <stdint.h>

_Bool is_zero(int64_t checkMe)
{   /* ensure that compiler will do some optimization */
   return checkMe==0x00000000LL;
}

2 个答案:

答案 0 :(得分:0)

您的代码中没有太多要优化的地方。

  1. 您可以使用实现定义的编译指示或属性来确保内联函数。

  2. 返回值不应为固定长度,而应为处理器本机大小的整数值

对于gcc

Dim wb As Workbook
Set wb = ActiveWorkbook
'Set wb = ThisWorkbook   '<== If you want the workbook containing the code
'Other code
wb.Activate

为什么用var words = "greet campaign coffee care revise ridge pilot full prison wrestle account dictionary start giant fast monarch patrol bear motif detective trouser title act speaker pursuit penny appear ballet agreement welcome similar sensation strong fog limited implicit nursery neighborhood infinite refund double achievement ample socialist intensify nomination visit drag retiree mislead situation credit oil clarify conscience war sow suitcase fixture worth fuss remain moment frighten spider breathe install interactive allow deadly cabin restless service rise integrity artist short circuit perception listen arrangement patience creep landscape stain citizen microphone nose bullet view category reign horizon news social reliable passion stroll constitutional adult city".split(/\s+/) 而不是int64_t?

让我们考虑8位微控制器:

inline int __attribute__((always_inline)) is_zero(int64_t checkMe)
{   /* ensure that compiler will do some optimization */
   return checkMe == 0;
}

和结果:

int

答案 1 :(得分:0)

您想如何进一步优化呢?您希望最终组装时有什么指示?

xchg rax, rax的第一页上,举例说明了几种为寄存器分配零值的方法。其中一些更长或更有效,但它们都做相同的事情。例: xor eax,eax lea rbx,[0] loop $ mov rdx,0 and esi,0 sub edi,edi push 0 pop rbp

与值进行比较并不像赋值那样丰富。为了进行比较,您基本上具有testcmpZF标志的校验。

我认为,最有效的方法是在test指令之后执行sete指令以获取ZF的值,如tkausl注释中发布的链接所示

通常来说,如果您希望编译器进行优化,则需要向其传递适当的标志

有关link的GCC优化信息,请参见

link用于MSVC优化