我看见了
this really interesting tweet
:
抵抗我的代码高尔夫本能转向
if(!bool1 && bool2)
进入之内
if(bool1<bool2)
我以前从未见过这种情况,所以我想看看编译器是否也会使用这种优化。我用自述文件和测试C程序启动了一个repo:
https://github.com/ndbroadbent/gcc_experiments
以下是测试程序:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int main(int argc, const char* argv[]) {
if(argc != 3) {
printf("Usage: %s <a> <b>\n", argv[0]);
exit(1);
}
bool a = strtol(argv[1], NULL, 10) != 0;
bool b = strtol(argv[2], NULL, 10) != 0;
if (!a && b) {
printf("!a && b == true (a: %d, b: %d)\n", a, b);
} else {
printf("!a && b == false (a: %d, b: %d)\n", a, b);
}
}
我试着用
gnu90
和
C99
标准。我知道C99有一个
bool
类型,但它仍被视为整数,因此编译器无法基于布尔逻辑进行任何优化吗?
我可能读错了程序集,但它看起来像c99
-O3
也包括
jne
和
je
指令,而不是仅仅使用一个“小于”操作和一个跳转指令。看起来C++也没有做出这种优化。