如果我有这样的函数调用for循环条件:
/* Jump into, after the user clicks on a listview item */
private void toogleToolbar() {
if (isStandardToolbar)
customToolbar();
else
originalToolbar();
isStandardToolbar = !isStandardToolbar;
}
/* Called inside onCreate and if nothing was clicked */
private void originalToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
/* Called after an click event */
private void customToolbar() {
LayoutInflater inflater = this.getLayoutInflater();
Toolbar toolbar = (ToolBar) inflater.inflate(R.layout.newtoolbar, null);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
每次迭代都会调用它吗?我希望是的。编译器是否允许对其进行优化?当前的编译器是否足够聪明?或者我更喜欢使用以下内容:
im=imread('imageBW.jpg');
intensity=mean(sum(im)./sum(im~=0));
答案 0 :(得分:6)
在
for ( auto it = s.begin(); it != s.end(), ++it )
s.begin()
只被调用一次
在循环的每次迭代中都会调用s.end()
和operator++()
(对于++it
)。
编译器是否允许对其进行优化?
编译器可以根据编译器,实现和优化级别优化对s.end()
的调用。如果能够优化operator++()
电话,我会感到惊讶。
当前的编译器是否足够聪明?
无法回答。
或者我更喜欢使用以下内容:
for (auto it = s.begin(), auto end = s.end(); it != end; ++it) {}
不会受伤。但是,如果在循环中修改s
,则可能会出现问题。如果循环中未修改s
,我建议使用此方法。
答案 1 :(得分:4)
是的,程序必须在每次迭代时调用第二个表达式it != s.end()
。我认为编译器可以在某些情况下优化它。
无论如何,不要做编译器的工作。如果它可以被优化,那么编译器已经很有可能做到这一点,并且无论如何这个调用没有显着的性能损失。
如果您的情况允许,您应该使用基于范围的循环:
for (auto& i : s) {
// instructions
}
这样,编译器就有更多优化代码的机会,而且更容易阅读。
如果您想了解编译器可以优化多少内容的一些示例,请查看此内容! http://ridiculousfish.com/blog/posts/will-it-optimize.html
答案 2 :(得分:1)
是的,它在每次迭代时都被正式调用。是的,当前的编译器可能会内联函数,并且每次都看到s.end()
返回相同的值(指针?)。
除非分析显示这是程序中的瓶颈(极不可能),否则不需要使代码复杂化。