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

loc*_*zed 3 c c++ gcc caching ternary-operator

在使用缓存模拟器(在创建内存跟踪之前使用 gcc 和 -O3 编译代码)时,发生了一件有趣的事情。

以下代码:如果被定义为三元运算符宏,a[i] = min(a[i], b[j])则会导致 4 次内存访问:如果被定义为 ,则会导致 3 次内存访问。minmin(x, y) (((x) < (y)) ? (x) : (y))minif (a < b) then a else b

显然,模拟器会获取宏中的所有变量(甚至是分支中未采用的变量),但if-else不会执行此操作。这只是模拟器固有的问题/错误,还是三元运算符的真正问题?

101*_*010 5

这实际上取决于编译器供应商。但是,考虑以下两个版本min(int, int)

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;
}
Run Code Online (Sandbox Code Playgroud)

GCC 5.3 版和带有 -O3 的 Clang 3.8 版为它们生成的汇编代码是相同的:

min(int, int):
        cmpl    %esi, %edi
        movl    %esi, %eax
        cmovle  %edi, %eax
        ret
Run Code Online (Sandbox Code Playgroud)

GCC 现场演示

CLANG 现场演示

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