单个x86指令可以在"0"和"1"之间切换布尔值吗?
我想到了以下方法,但都导致了两个指令与-cc标志的gcc.
status =! status;
status = 1 - status;
status = status == 0 ? 1: 0;
int flip[2] = {1, 0};
status = flip[status];
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?
这就是我尝试过的:https://godbolt.org/g/A3qNUw
我需要的是一个切换输入和返回的函数,以编译为一条指令的方式编写.与此功能类似的东西:
int addOne(int n) { return n+1; }
Run Code Online (Sandbox Code Playgroud)
lea eax, [rdi+1] # return n+1 in a single instruction
ret
Run Code Online (Sandbox Code Playgroud) 如果某个函数的行为取决于一系列条件,则可以使用不同的if-return块或一系列if-else块来计算它.示例计算模式:
void f(params) // isolated if-blocks
{
if (cond1) {
// computational steps
return;
}
if (cond2) {
// computational steps
return;
}
// computational steps of last case
}
void f() // unique if-else block
{
if (cond1) {
// computation
} else if (cond2) {
// computation
} else { // last condition
// computation
}
}
Run Code Online (Sandbox Code Playgroud)
我会说第一个总是更具可读性,但我不知道第二个是否最好来自设计(易于维护/错误)或性能(分支预测/编译器优化)的观点.
这两种方法的优点和缺点是什么?我没有考虑过其他什么?
switch语句似乎完全没用.它能做的任何事情都可以通过if和else来完成.
他们甚至可能编译成相同的代码.
那么为什么要费心呢?
break交换机中的语句label:让我发疯,这种格式让我想起了goto.
这是针对objective-c,c,C++的.我不确定vb.net是否有switch语句,但即使它确实如此,我必须忘记因为我从来没有使用它.
我正在使用c ++编写一个2D引擎,我知道一个if语句在CPU使用率方面的成本低于switch语句; 但是,switch声明和if声明之间的区别是现代PC甚至是移动端口可忽略不计,还是我必须switch不惜一切代价避免?