三元运算符缓存不友好吗?

时间:2016-04-06 18:29:55

标签: c++ c caching gcc ternary-operator

在使用缓存模拟器(在创建内存跟踪之前使用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也不会这样做。这只是模拟器内在的事物/错误,还是三元运算符的真正问题?

2 个答案:

答案 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;
}

GCC Live Demo

CLANG Live Demo

因此,至少对于两个主要供应商而言,两个版本(即三元运算符和if-else)是等价的。

答案 1 :(得分:0)

通常,使用三元运算符和if-then-else语句会在编译器中产生相同的中间表示。两者都做同样的事情,两者都是缓存友好的。

我怀疑差异来自于你在两个实现之间改变的其他事情,但是没有看到它们我就无法告诉你问题是什么。