当在gcc中使用O2时,这个向量如何被优化10倍

How can this vector be optimized 10 times faster when using O2 in gcc?

本文关键字:向量 10倍 优化 gcc O2 当在      更新时间:2023-10-16

这是我的代码:

while (vector0.size())
{
    for (ii = vector0.begin(); ii != vector0.end(); ii++) 
        if  (table[*ii] > table[*max]) max = ii;
    /*
     Here I add push_back something to vector and erase something from vector.
    */
}

热代码是for循环和if语句。

如果我在gcc(以及clang)中启用-O2-O3,它将变得快10倍左右。我想知道这是怎么发生的。

才10次?游手好闲的人。我所期望的最大优化是删除operator[]上的范围检查,这反过来使其可内联。此外,end调用也可以内联(begin调用一次,所以它是一个不关心)。

顺便说一句,就叫std::max_element吧。

模板生成大量代码。大部分代码可以安全地删除,但这是一个昂贵的过程,只有在更高的优化级别上才能执行。

实际执行的优化取决于编译器和调用标志,但它是函数内联和死代码消除,在你的情况下产生非常显著的差异。