我有Moose代码,其中包含如下方法:
sub foo { my ($self) = shift; my $test_y = $self->pos->[1]; #... if ($self->is_map_val($self->pos->[0]+8,$test_y+32) || $self->is_map_val($self->pos->[0]+32-8,$test_y+32)) { { heavy_stuff(); } #...}
当我运行perl -MO = Deparse ./program.pl时,我得到几乎相同的代码行:
if ($self->is_map_val($self->pos->[0] + 8,$test_y + 32) or $self->is_map_val($self->pos->[0] + 32 - 8,$test_y + 32)) { heavy_stuff();}
我想知道为什么Perl没有将32-8优化为24?是否有任何真正的原因Perl没有这样做(也许Moose子系统让生活变得更难?).
如果它有帮助,我运行Perl(v.5.14.2)
解决方法 这与穆斯没有任何关系.在$x + 32 - 8
评估顺序相当于
($x + 32) - 8
(即 – 具有相同的优先级并且是左关联的).作为一棵树:
(-) / \ (+) 8 / $x 32
该语法树的任何部分都只有常量节点:$x 32不是常量,PREVIoUS_PART – 8也不是常数.因此,常量折叠(仅在此树级 *** 作,并且无法对树的部分重新排序)看不到任何优化机会.
您确实可以将优化重新排序为32 – 8 $x.
perlguts文档常量折叠,并特别声明它通过替换树的部分来 *** 作.
总结以上是内存溢出为你收集整理的Perl内部和Moose:恒定折叠优化全部内容,希望文章能够帮你解决Perl内部和Moose:恒定折叠优化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)