【发布时间】:2011-04-22 21:25:06
【问题描述】:
一个下雨的下午我很无聊,想出了这个:
int ia_array[5][5][5]; //interger array called array
{
int i = 0, j = 0, k = 0;//counters
while( i < 5 )//loop conditions
{
ia_array[i][j][k] = 0;//do something
__asm inc k;//++k;
if( k > 4)
{
__asm inc j; //++j;
__asm mov k,0;///k = 0;
}
if( j > 4)
{
__asm inc i; //++i;
__asm mov j,0;//j = 0;
}
}//end of while
}//i,j,k fall out of scope
它在功能上等同于三个嵌套的 for 循环。但是在 for 循环中不能使用 __asm 语句。此外,您可以选择不将计数器放在范围内,以便您可以将它们重用于其他循环。我已经查看了两者的反汇编,我的替代方案有 15 个操作码,嵌套的 for 循环有 24 个。因此它可能更快吗?假设我真的要问的是 __asm inc i;比 ++i 更快;?
注意:我无意在任何项目中使用此代码,只是出于好奇。感谢您的宝贵时间。
【问题讨论】:
-
我怀疑它会更快,但取决于循环内部的内容,它可能会慢很多。如今,编译器可以进行一些很棒的优化,但是在循环中间向它们抛出汇编语句会使它们的生活变得艰难。由于编译器通常没有简单的方法来判断 asm 内部发生了什么,因此很难优化。
-
如果
asm inc i比++i快,那你的编译器就需要从后面拿出来拍了。 -
@Mike:对于
mov j,0和j = 0,我会说同样的话。 -
@damon: +1 @dreamlax: 我同意,我只是在玩 __asm
-
@dreamlax:实际上,你很容易就错了。一个体面的编译器几乎肯定会在寄存器中至少包含 i,并且很可能有 j 和 k,并将它们归零为
xor reg, reg,(或等效地,sub reg, reg),这稍微更有效。
标签: c++ optimization assembly