2009-04-29 99 views
1

如果一个结构很大,有很多成员变量。某些功能需要访问结构中的4-5个元素以便其工作,因此以下哪种情况可能会缓存有效(减少缓存未命中次数) -将大结构指针传递给函数缓存有效吗?

1.)将指针传递给结构作为参数函数,进而访问需要的元素(假设元素在结构声明中不连续,并且它们分开)

2.)将各个结构成员变量作为参数传递给函数。

首先,此方案是否首先从缓存视角影响代码的性能?

谢谢。

〜AD

回答

1

忽略缓存的问题,传递指针永远是最快的,因为没有复制有趣的领域的开销。

+0

由于显而易见的复制周期和内存开销的原因,传递结构实例当然不是一个选项。 – goldenmean 2009-04-29 12:31:36

1

嗯......如果访问的成员很多缓存线分开,那么它可能会帮助,让他们收集的所有(在栈上,甚至在寄存器如果可能的话)作为参数,如果功能做了很多访问。如果不是这样,读出参数和设置呼叫的额外开销可能会带来好处。

我认为这是一个微型优化,你应该剖析这两种情况,然后记录你对代码进行的所有分析所做的任何修改(因为对于偶然的观察者来说它并不明显) , 稍后的)。

0

内存访问是内存访问。它是否发生在呼叫者或被呼叫者中并不重要。忽略缓存,传递指针(通过引用传递)有几个原因。

  • 分离关注点表明被调用者应该决定要访问的内容。
  • 传递更多参数可能会增加寄存器文件的压力和/或导致对堆栈的更多访问。
  • 传递一个参数比几个参数更具可读性。 (可能与关注点分离有关)

提高缓存性能的唯一方法是改善局部性。排列变量在struct(或其他)定义中是连续的。排列算法只访问一次结构。如果这些都不是简单的改变,而且程序是缓存绑定的,那么性能只需要花费很多的编程工作。