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)
很抱歉很长时间的反馈,我出去了.
从gcc手册:
-funsafe-loop-optimizations此选项告诉循环优化器假设循环索引不会溢出,并且具有非平凡退出条件的循环不是无限的.即使循环优化器本身无法证明这些假设是有效的,这也可以实现更广泛的循环优化.如果使用
-Wunsafe-loop-optimizations,编译器会在发现这种循环时发出警告.
因此,显然,编译器中range-for循环的实现在某种程度上被打破,因为它触发了这个警告.您可以禁用此特定警告或禁用此特定优化...我会建议后者,因为我不清楚在触发警告时是否实际执行了优化.
| 归档时间: |
|
| 查看次数: |
2202 次 |
| 最近记录: |