C++ 对于C++;指示_迭代器u没有别名

C++ 对于C++;指示_迭代器u没有别名,c++,iterator,aliasing,C++,Iterator,Aliasing,g++确实为指针实现了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,但我找不到关于迭代器的任何信息。我的总体意图是鼓励编译器将stl循环矢量化 编辑: 即使编译器无法矢量化,\uuuuuu restrict\uuuu关键字也应该能够告诉编译器在循环中不需要不必要的重新加载。我不知道您直接问题的答案。但是,编译器将只能对std::vector的循环进行向量化,因为它是唯一一个(我认为)具有连续存储且连续存储位置之间没有依赖关系的容器(不同

g++确实为指针实现了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但我找不到关于迭代器的任何信息。我的总体意图是鼓励编译器将stl循环矢量化

编辑:


即使编译器无法矢量化,
\uuuuuu restrict\uuuu
关键字也应该能够告诉编译器在循环中不需要不必要的重新加载。

我不知道您直接问题的答案。但是,编译器将只能对
std::vector
的循环进行向量化,因为它是唯一一个(我认为)具有连续存储且连续存储位置之间没有依赖关系的容器(不同于例如
std::list
)。不过,我不知道该怎么做

更新

经过一些实验(可能与总体目标相关,也可能与总体目标无关),我发现在ICC中,以下内容没有矢量化:

typedef std::vector<float> V;

V vec(4096);

for (V::iterator it = vec.begin(); it != vec.end(); ++it)
{
    *it *= *it;
}
显然,问题不在于迭代器太多,而在于循环构造内部对
vec.end()
的调用,这显然是无法分解的,即使循环体显然不会影响向量边界


在GCC中,我无法获得任何矢量化。这并不奇怪,因为GCC在发现SSE机会方面比ICC差得多。

在连续存储上对随机访问迭代器进行矢量化实际上已经有很大的帮助。@Konrad:似乎即使给(std::vector::iterator…循环一个微不足道的
,甚至ICC(在矢量化方面通常比GCC好得多)无法矢量化。@srean:请参阅我对@Konrad的评论回复。即使使用
矢量(即不可能存在依赖关系的原语矢量),编译器也无法矢量化(
循环未矢量化:不支持的循环结构。
)@Konrad:经过更多的实验,我发现这个循环构造不会矢量化:
for(vec_t::iterator it=vec.begin();it!=vec.end();++it)
,而这个将:
vec_t::iterator iterand=vec.end();for(vec_t::iterator it=vec.begin();it!=itEnd;++it)
。所以问题似乎不是太多迭代器,而只是调用
vector::end()
,无论出于何种原因,它都无法优化。当你说GCC吸收了矢量化循环时,你有没有尝试过启用选项
GCC-O2-ftree vectorize-msse[2]尽管许多编译器支持它,但代码在< C++标准】中没有正式指定。
V vec(4096);

V::iterator it2 = vec.end();
for (V::iterator it = vec.begin(); it != it2; ++it)
{
    *it *= *it;
}