/ / C ++ 2011: розгортання циклу на основі діапазону? - c ++, цикли, побудова компілятора, c ++ 11

C ++ 2011: розгортання циклу на основі діапазону? - c + +, цикли, конфігурація конструкції, c + + 11

Цікаво, якщо компілятори C ++ розгорнуть цикл на основі діапазону так само, як вони зараз роблять для "нормальних" циклів, щоб максимізувати продуктивність або в деяких випадках петлі на основі діапазонів будуть повільнішими, ніж звичайні петлі?

Велике спасибі.

Відповіді:

7 для відповіді № 1

для циклу на основі діапазону еквівалентно:

{
auto && __range = ( /expression/ );
for (auto __begin = begin(__range),
__end   = end(__range);
__begin != __end;
++__begin) {
/declaration/ = *__begin;
/statement/
}
}

Якщо компілятор знає кількість ітерацій і він може вирішити залежність циклу або петлі незалежні, то компілятор вільний для видалення.

Загалом, розгортання циклів дозволить підвищити продуктивність лише для менших циклів. Отже, IMO, не має значення, чи розгорнуті петлі на основі діапазону чи ні. Можна, звичайно, порівняти з -O3 і -funroll-loops та відповідні варіанти, щоб побачити, чи дійсно є різниця між двома.


5 для відповіді № 2

Швидше за все, компілятори переводять діапазон для циклів у свій звичайний цикл, тому я очікую, що вони будуть еквівалентними.