在使用缓存模拟器(在创建内存跟踪之前使用gcc和-O3编译代码)时,发生了一件有趣的事情。
以下代码:a[i] = min(a[i], b[j])
如果min
被定义为三元运算符宏,则会导致4次内存访问:min(x, y) (((x) < (y)) ? (x) : (y))
如果min
定义为if (a < b) then a else b
则会进行3次内存访问{1}}。
显然,模拟器会获取宏中的所有变量(即使是未采用分支中的变量),而if-else
也不会这样做。这只是模拟器内在的事物/错误,还是三元运算符的真正问题?
答案 0 :(得分:4)
这实际上取决于编译器供应商。但是,考虑以下两个版本的if($(this).val() == null || $(this).val() == undefined)
:
min(int, int)
GCC版本5.3和Clang版本3.8与-O3为它们生成的汇编代码是相同的:
int min(int a, int b) {
return (a < b)? a : b;
}
int min(int a, int b) {
if(a < b)
return a;
else
return b;
}
因此,至少对于两个主要供应商而言,两个版本(即三元运算符和if-else)是等价的。
答案 1 :(得分:0)
通常,使用三元运算符和if-then-else语句会在编译器中产生相同的中间表示。两者都做同样的事情,两者都是缓存友好的。
我怀疑差异来自于你在两个实现之间改变的其他事情,但是没有看到它们我就无法告诉你问题是什么。