/ / 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

Шансовете са, че компилаторите превеждат обхвата на базата на цикли в редовния им цикъл, затова бих очаквал, че те ще бъдат еквивалентни.