Я не знаю ответа на ваш прямой вопрос. Тем не менее, компилятор сможет когда-либо только векторизовать цикл для 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 я не мог получить что-либо для векторизации. Это неудивительно, потому что GCC намного хуже, чем ICC в определении возможностей SSE.