函数调用for循环条件?

时间:2015-10-19 15:17:10

标签: c++ c++11

如果我有这样的函数调用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));

3 个答案:

答案 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()返回相同的值(指针?)。

除非分析显示这是程序中的瓶颈(极不可能),否则不需要使代码复杂化。