我正在阅读有关哈希函数的内容(我是一名中级计算机科学学生),并发现了这一点:
int hash (const string & key, int tableSize) {
int hasVal = 0;
for (int i = 0; i < key.length(); i++)
hashVal = 37 * hashVal + key[i];
.....
return hashVal;
}
我正在查看这段代码,注意到如果在 for 循环中而不是每次我们这样做时调用 key.length() ,它会更快:
int n = key.length();
for (int i = 0; i < n; i++)
我的问题是,既然这是一种明显可以稍微提高性能的方法,编译器是否会自动为我们执行此操作?我对编译器还不太了解,但我很好奇这个问题的答案。当编写使用较少操作的代码时,人们经常指出,我所做的事情通常已经由编译器为我完成了,所以我浪费时间去做内联函数之类的事情。我关心这一点是因为我正在编写一款游戏,其中物理处理需要高效,这样事情就不会感觉笨重。
简短的回答:有时可以...
长答案:
如果编译器可以根据循环本身确定 key.length() 是一个“常量”值,那么它将能够优化调用。这又取决于所使用的类的定义(在本例中string
,我们可以期待它“写得很好”)。它还依赖于编译器理解循环不会改变key
以某种方式改变key.length()
.
使其发挥作用的关键要素是该功能是inline
(或者是一个模板函数,inline
需要允许它多次包含在不同的编译单元中 - 或者在同一源文件中可用),并且源代码位于编译单元包含的头文件中。
当然,C++ 标准中并没有要求编译器执行此操作。每次调用该函数都完全符合标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)