英特尔文档没有说明是否这样做,例如数组的乘法和加法:
c[:] = c[:] + a[:]*b[:]
它会执行以下操作吗:
for(i=0; i<N; i++) tmp[i] = a[i]*b[i];
for(i=0; i<N; i++) c[i] = c[i] + tmp[i];
或
for(i=0; i<N; i++) c[i] = c[i] + a[i]*b[i];
对于大型阵列,存在显著的性能差异。据我所知,当使用STL向量进行此类向量操作时,前一个操作已经完成。
提前感谢您的回答!
icc12.1中的数组表示法生成了临时的,因为Fortran就是这样做的,而且看起来更安全。然后我们发现,正如问题所指出的,临时性会对性能产生很大影响。因此,在icc13.0中(以及在公共规范中)对数组表示法进行了修订,因此不会生成临时的。
不生成临时性与C++的"惩罚最小的抽象"哲学以及C/C++不为结构分配生成临时性的事实是一致的。
另请参阅我的ISC 2012教程的幻灯片33。