我有一些琐碎的代码,但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 = {};
};

vector 在我的代码中永远不会超过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/blob/master/src/libwatermark/transform/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,它似乎可以识别警告提示,所以我猜他们也实现了优化,并且我没有收到任何警告(但是编译时间更快\o)

很抱歉收到长时间的反馈,我出来了。

最佳答案

从gcc手册:

因此,显然,编译器中的range-for循环实现由于触发该警告而被某种方式破坏了。您可以禁用此特定警告,也可以禁用此特定优化……我建议后者,因为在触发警告时尚不清楚优化是否确实完成。

关于c++ - 为什么gcc提示我的循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20858834/

10-09 22:48