是否有类似于C ++的restrict关键字,表明_iterators_没有别名

时间:2011-02-13 10:52:31

标签: c++ iterator aliasing

g ++确实为指针实现了__restrict__,但我找不到任何关于迭代器的东西。我的总体意图是鼓励编译器对stl循环进行矢量化。

修改

即使编译器无法进行向量化,__restrict__关键字也应该告诉编译器在循环中不需要不必要的重新加载。

1 个答案:

答案 0 :(得分:6)

我不知道你直接问题的答案。但是,编译器只能为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;
}

而以下是:

V vec(4096);

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

显然,问题不在于迭代器,而在循环结构中对vec.end()的调用,显然无法将其考虑在内,即使很明显循环体不会影响向量边界

在海湾合作委员会,我无法得到任何矢量化。这并不奇怪,因为GCC在发现SSE机会方面比ICC差得多。