为什么gcc抱怨我的循环?

Jea*_*ier 24 c++ gcc for-loop c++11

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

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

这是我的代码版本(剥离了所有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 = {};
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中,向量永远不会超过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这里谈论信息的重点,但如果你想看到整个代码(我判断为SO帖子太长了),它就在这里:https: //github.com/jcelerier/watermarking/斑点/主/ SRC/libwatermark /变换/ FFTWManager.h

GCC: gcc version 4.8.2 (Debian 4.8.2-10)

我不明白为什么从unsigned int更改为size_type会改变任何东西,因为我的setChannels方法中没有得到任何警告(即使我认为它在我的平台上是长的unsigned int)并且一旦设置了大小,原始类型用于设置它的变量似乎与我无关.

基本for(int i = 0; i < bw.size(); i++)版或迭代器版没有警告for(auto i = bw.begin(); i != bw.end(); i++).

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

很抱歉很长时间的反馈,我出去了.

Mat*_* M. 8

从gcc手册:

-funsafe-loop-optimizations

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

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