簡體   English   中英

為什么gcc抱怨我的循環?

[英]Why does gcc complain about my loops?

我有一些相當簡單的代碼,仍然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信息,但如果你想看到整個代碼(我判斷為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,它似乎認識到警告swich所以我猜他們也實現了優化,我沒有得到任何警告(但更快的編譯時間\\ o)

很抱歉很長時間的反饋,我出去了。

從gcc手冊:

-funsafe-loop-optimizations

此選項告訴循環優化器假設循環索引不會溢出,並且具有非平凡退出條件的循環不是無限的。 即使循環優化器本身無法證明這些假設是有效的,這也可以實現更廣泛的循環優化。 如果使用-Wunsafe-loop-optimizations ,編譯器會在發現這種循環時發出警告。

因此,顯然,編譯器中range-for循環的實現在某種程度上被打破,因為它觸發了這個警告。 您可以禁用此特定警告或禁用此特定優化...我會建議后者,因為我不清楚在觸發警告時是否實際執行了優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM