这是一个纯粹迂腐的问题,以满足自己的好奇心.
我倾向于在问题中使用后一种选择(所以if (boolCheck) { ... }:),而同事总是写前者(if (boolCheck == true) { ... }).我总是有点嘲笑他,并且从他第一次开始编程时他总是把它解释为一种旧习惯.
但是我今天刚刚想到,实际写出整个== true部分可能实际上需要一个额外的处理步骤,因为任何带有==运算符的表达式都会被计算为布尔值.这是真的?
换句话说,据我所知,没有 == true行的选项可以松散地描述如下:
使用 == true行的选项更像是:
我对么?或者也许任何普通的编译器/解释器都会消除这种差异?或者我忽略了什么,而且根本没有什么区别?
显然,在实际观察到的性能方面没有区别.就像我说的,我只是好奇.
编辑:感谢所有实际发布编译结果的人,以说明两种方法之间的步骤是否不同.(看起来,大部分时间,它们都是,虽然只是轻微的.)
我只想重申,我并不是在问什么是"正确的"方法.我知道很多人喜欢一个人而不是另一个人.我也理解,从逻辑上讲,两者是相同的.如果CPU执行的实际操作对于两种方法完全相同,我只是很好奇; 事实证明,在很多时候(显然它取决于语言,编译器等),它们不是.
通过在GitHub上托管的Sascha Willem的C++ Vulkan演示,我注意到一些函数返回了数据类型VkBool32.
我很好奇为什么当我注意到Line时,Khronos没有使用普通的bool
typedef uint32_t VkBool32;
在vulkan.h.uint32_t定义为
typedef unsigned int uint32_t;
在stdint.h中.
我的问题是,如果一个标准的Bool只用一个字节来完成这个工作,为什么它会让Sense丢掉3个字节?我的小Recherche显示没有性能差异(请参阅哪个更快:if(bool)或if(int)?),而Khronos他们自己说他们希望最小化兼容性问题(在这种情况下,旧C没有原始布尔类型)以便专注于现代代码.
(见Trevett的报价取自这里)
一个彻底的重新设计,我们不向后兼容
说,我有一个如下所示的功能
void caller()
{
int flag = _getFlagFromConfig();
//this is a flag, which according to the implementation
//is supposed to have only two values, 0 and 1 (as of now)
callee_1(flag);
callee_2(1 == flag);
}
void callee_1(int flag)
{
if (1 == flag)
{
//do operation X
}
}
void callee_2(bool flag)
{
if (flag)
{
//do operation X
}
}
Run Code Online (Sandbox Code Playgroud)
哪个被调用函数将是更好的实现?
我已经完成了这个链接,并且我非常确信在一个if条件下将bool用于比较没有太大的性能影响.但在我的情况下,我将标志作为整数.在这种情况下,第二个被叫者是否值得去?
在使用 Go 中的一些简单代码时,我注意到使用 bool 数组而不是 int 数组(仅使用 0/1 值)具有相当显着的加速效果。
我本来期望它们都能提供相同的性能,因为在机器级别没有本机 bool 类型,所以我期望编译器生成类似的汇编代码。
由于差异相当大,我对这个结果的有效性表示怀疑。
我正在使用命令“go build filename.go”进行构建,但我不确定 gcc 的“-O3”的等效标志是什么。
func funcUsingBool(n int) int {
if n < 1 { return 0 }
notPrime := make([]bool, n+1)
count := 1
for i := 3; i < n; i = i + 2 {
if notPrime[i] { continue }
count++
k := 2 * i
for k <= n {
notPrime[k] = true
k += i
} …Run Code Online (Sandbox Code Playgroud) boolean ×3
c++ ×3
performance ×2
c ×1
function ×1
go ×1
integer ×1
optimization ×1
types ×1
vulkan ×1