C++ 为什么这个函子在优化时比普通代码性能更好?

C++ 为什么这个函子在优化时比普通代码性能更好?,c++,optimization,macros,functor,C++,Optimization,Macros,Functor,继续我的探索… 通过使用多行宏,我成功地实现了一个求相邻单元格差异之和的通用算法。以前我使用函子,但性能很差 //T0,T:double[T\u size\u x*T\u size\u y*T\u size\u z] 样板 无效过程(双*T0,双*T,常数int&T\u size\u x,常数int&T\u size\u y,常数int&T\u size\u z){ 双和,基数; const int dy=(T_size_y-1)*T_size_x; 常数int dz=(T_size_z-1)*

继续我的探索… 通过使用多行宏,我成功地实现了一个求相邻单元格差异之和的通用算法。以前我使用函子,但性能很差

//T0,T:double[T\u size\u x*T\u size\u y*T\u size\u z]
样板
无效过程(双*T0,双*T,常数int&T\u size\u x,常数int&T\u size\u y,常数int&T\u size\u z){
双和,基数;
const int dy=(T_size_y-1)*T_size_x;
常数int dz=(T_size_z-1)*T_size_x*T_size_y;
int pos=0;//T\u size\u x*j;
结构差异{
内联void运算符()(const int&pos){sum+=T0[pos]-base;}
内联空边(常量int&pos){sum+=0.5*(T0[pos]-基);}
_Diff(double&s,double&b,double*t0):和(s),基(b),t0(t0){
私人:
双重&总和;
双基;
双*T0;
}差异(总和、基数、T0);
#定义BigOne(i、周期、T_大小、左、右、开始、结束)\
如果(i>0)差异(左)\
if(i
为了提高代码的性能,我还考虑将函子转换为宏

#定义差异(pos)和+=T0[pos]-base
#定义差异边缘(pos)和+=0.5*(T0[pos]-基)
//注意:将BigOne中的Diff.edge也更改为Diff_edge
当使用
g++
(4.8.2)编译而不进行优化时,正如预期的那样,宏代码运行速度会大大加快。但是当我用
-O2
-O3
编译它时,上面的第一个示例突然产生了更好的结果(在15000次迭代中,functor在22.7秒内完成,macro在23.7秒内完成)


为什么会这样?函子是否以某种方式作为编译器缓存指令的提示?

如果怀疑指令缓存效果差异似乎是由于分支未命中造成的,请尝试查看生成的程序集,和/或在Cachegrind()中运行这两个版本。我不明白函子代码是如何减少的。