为什么gcc抱怨我的循环?

时间:2013-12-31 14:36:31

标签: c++ gcc c++11 for-loop

我有一些相当简单的代码,仍然gcc抱怨(在-O3 -march=native中)关于循环展开:

cannot optimize loop, the loop counter may overflow [-Wunsafe-loop-optimizations]
for(auto& plan : fw)
^

这是我的代码版本(剥离了所有fftw的东西,否则它会很长)

class FFTWManager
{
    public:
        void setChannels(unsigned int n)
        {
            fw.resize(n);
            bw.resize(n);
                            //some fftw-specific stuff comes here
        }

        void forward()
        {
            for(auto& plan : fw)
                fftw_execute(plan);
        }

        void backward()
        {
            for(auto& plan : bw)
                fftw_execute(plan);
        }

    private:
        std::vector<fftw_plan> fw = {};
        std::vector<fftw_plan> bw = {};
};

我的代码中的向量永远不会超过2。


根据评论编辑: 我用了很多旗帜。

-pedantic -Wextra -Weffc++ -Wall -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion -Wdisabled-optimization -Wformat -Wformat=1 -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimport -Winit-self -Winline -Winvalid-pch -Wunsafe-loop-optimizations -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wpacked -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstack-protector -Wstrict-aliasing=3 -Wswitch -Wswitch-default -Wswitch-enum -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings

我没有看到关于在fftw_execute放置关于gcc version 4.8.2 (Debian 4.8.2-10)的信息的说法,但是如果你想看到整个代码(我判断为SO帖子太长了),它就在这里: https://github.com/jcelerier/watermarking/blob/master/src/libwatermark/transform/FFTWManager.h

海湾合作委员会:setChannels

我不明白为什么从unsigned int更改为size_type会改变任何内容,因为我的for(int i = 0; i < bw.size(); i++)方法中没有任何警告(即使我认为它在我的平台上是长的unsigned int)并且一旦大小已设置,用于设置它的变量的原始类型似乎与我无关。

基本for(auto i = bw.begin(); i != bw.end(); i++)或迭代器版本{{1}}没有警告。

我也尝试过clang,它似乎认出了警告swich所以我猜他们也实现了优化,我没有得到任何警告(但更快的编译时间\ o)

对于长时间的反馈感到抱歉,我出去了。

1 个答案:

答案 0 :(得分:8)

来自gcc手册:

  

-funsafe-loop-optimizations

     

此选项告诉循环优化器假设循环索引不会溢出,并且具有非平凡退出条件的循环不是无限的。即使循环优化器本身无法证明这些假设是有效的,这也可以实现更广泛的循环优化。如果使用-Wunsafe-loop-optimizations,编译器会在发现这种循环时发出警告。

因此,显然,编译器中range-for循环的实现在某种程度上被打破,因为它触发了这个警告。您可以禁用此特定警告或禁用此特定优化...我会建议后者,因为我不清楚在触发警告时是否实际完成了优化。

相关问题