我的代码如下所示:
void foo(unsigned long k)
{
if (k & 1)
{
bar(k/2 + 1);
bar(k/2);
bar(k/2 + 1);
}
else
{
bar(k/2);
bar(k/2);
bar(k/2);
}
}
void bar(unsigned long k)
{
switch(k)
{
case default: special_default(); break;
case 1: specialbar1(); break;
case 2: specialbar2(); break;
<more cases>
case 16: specialbar16(); break;
}
}
foo
当调用 的偶数值时,性能要好得多k
。每种specialbar#()
方法都使用几个堆栈变量,这些变量的数量随着增加而急剧k
增加。为了清楚specialbar#()
起见,使用了关于3 * k
局部变量,所有这些都是unsigned long long
变量。
例如foo(32)
,执行速度比foo(31)
. 我正在使用 Visual Studio 2012,性能分析向我保证,两次调用specialbar16
和一次调用specialbar15
比连续三次调用specialbar16
.
编译器是否有可能在k
偶数时利用三个连续调用?也就是说,它能否意识到堆栈在连续三个连续调用中基本相同,k
但对于奇数不可能进行相同的优化k
?