Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 三值运算符缓存是否不友好?_C++_C_Caching_Gcc_Ternary Operator - Fatal编程技术网

C++ 三值运算符缓存是否不友好?

C++ 三值运算符缓存是否不友好?,c++,c,caching,gcc,ternary-operator,C++,C,Caching,Gcc,Ternary Operator,在玩缓存模拟器(在创建内存跟踪之前用gcc和-O3编译代码)时,发生了一件有趣的事情 以下代码:a[i]=min(a[i],b[j])如果将min定义为三元运算符宏,则会导致4次内存访问:min(x,y)((x。C和C++是不同的语言,语义不同。请提供一份报告。如果你有一个完整的例子来说明不同之处,那会很有帮助。因此,所提供的答案基本上与你的前提相矛盾。我们投票赞成用几个主要的编译器实际检查生成的代码。 int min(int a, int b) { return (a < b)? a

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

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

显然,模拟器会获取宏中的所有变量(甚至是未获取的分支中的变量),而
if-else
不会这样做。这只是一个模拟器固有的东西/错误,还是三元运算符的真正问题?

这取决于编译器供应商。但是,考虑到以下两种版本的
min(int,int)


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

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


我怀疑这两个实现之间的差异来自于您在其他方面所做的更改,但在没有看到它们的情况下,我无法告诉您问题所在。

我认为答案将完全取决于您使用的编译器,可能还取决于您使用的优化级别。
那么
是什么?从什么时候起,<代码>如果< /C++ >语句产生一个值,就好像它是一个表达式一样?建议把真正的代码张贴为“min被定义为<代码>(a < b),然后是另一个b<代码> >。C和C++是不同的语言,语义不同。请提供一份报告。如果你有一个完整的例子来说明不同之处,那会很有帮助。因此,所提供的答案基本上与你的前提相矛盾。我们投票赞成用几个主要的编译器实际检查生成的代码。
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;
}
min(int, int):
        cmpl    %esi, %edi
        movl    %esi, %eax
        cmovle  %edi, %eax
        ret