我可以安全地假设 if(true) 和 if(false) 将被优化吗?
Can I safely assume that if(true) and if(false) will be optimized?
在我的代码中,有时我有一个带有 bool value
模板参数的函数。 true
和 false
情况下函数的实现几乎相同,除了一行。所以我想我只要放一个 if(value)
语句就可以避免重写同一个函数两次。调用该函数时,value
在编译时确定,因此 if
语句简化为 if(true)
或 if(false)
。
现在,我想知道:假设任何合理的编译器(例如 g++
、clang++
、...)会优化该语句是否安全?
是的,性能很关键,是的,这个函数非常轻量级,所以即使是一个 if
也会影响速度,是的,这个函数需要在实时设备上执行无数次许多人的生命所依赖的。
简短的回答是 "yes"。编译器将评估常量表达式,并在分支中确定分支是始终采用还是从不采用。
这是一个例子:
#include <stdio.h>
void test(void) {
if (false) {
puts("Hello, world!");
}
}
这是输出程序集:
test():
push rbp
mov rbp, rsp
nop
pop rbp
ret
请注意,甚至没有发出对 puts
的调用。这是没有启用优化的 GCC 6.3(优化已关闭 ,这仍然以正确的方式发生)。
在我的代码中,有时我有一个带有 bool value
模板参数的函数。 true
和 false
情况下函数的实现几乎相同,除了一行。所以我想我只要放一个 if(value)
语句就可以避免重写同一个函数两次。调用该函数时,value
在编译时确定,因此 if
语句简化为 if(true)
或 if(false)
。
现在,我想知道:假设任何合理的编译器(例如 g++
、clang++
、...)会优化该语句是否安全?
是的,性能很关键,是的,这个函数非常轻量级,所以即使是一个 if
也会影响速度,是的,这个函数需要在实时设备上执行无数次许多人的生命所依赖的。
简短的回答是 "yes"。编译器将评估常量表达式,并在分支中确定分支是始终采用还是从不采用。
这是一个例子:
#include <stdio.h>
void test(void) {
if (false) {
puts("Hello, world!");
}
}
这是输出程序集:
test():
push rbp
mov rbp, rsp
nop
pop rbp
ret
请注意,甚至没有发出对 puts
的调用。这是没有启用优化的 GCC 6.3(优化已关闭 ,这仍然以正确的方式发生)。