Могут ли современные компиляторы разворачивать `for `циклы, выраженные с помощью итераторов начала и конца

Рассмотрим следующий код

 vector<double> v;
 // fill v
 const vector<double>::iterator end =v.end();
 for(vector<double>::iterator i = v.bgin(); i != end; ++i) {
   // do stuff
 }

Могут ли такие компиляторы, как g++, clang++, icc разворачивать такие циклы. К сожалению, я не знаю ассемблера, чтобы проверить на выходе, разворачивается ли цикл или нет. (и у меня есть доступ только к g++.)

Мне кажется, что это потребует от компилятора большей сообразительности, чем обычно: сначала сделать вывод, что итератор является итератором с произвольным доступом, а затем выяснить, сколько раз выполняется цикл. Могут ли компиляторы сделать это при включенной оптимизации?

Спасибо за ваши ответы, и прежде чем некоторые из вас начнут читать лекции о преждевременной оптимизации, это упражнение на любопытство.

10
задан san 17 July 2012 в 19:02
поделиться