Развертка цикла
От: Faust Россия  
Дата: 27.10.04 13:10
Оценка:
Есть функция
void ClipToPower2(dword& dwValue)
{
    dwValue |= (dwValue >> 16);
    dwValue |= (dwValue >> 8);
    dwValue |= (dwValue >> 4);
    dwValue |= (dwValue >> 2);
    dwValue |= (dwValue >> 1);
    dwValue += 1;
}
, в теле которой развернут цикл
    for(dword dwIndex = ((8 * sizeof(dword) >> 1)); dwIndex > 0; dwIndex >>= 1)
        dwNumber |= (dwNumber >> dwIndex);
    dwNumber += 1;
. Так вот, можно ли считать следующий код
template <mword t_wmID> struct switch_id
{
    enum identifier { id = t_wmID };
};

template <typename T>
inline void ClipToPower2(T& tNumber)
{
    return ClipToPower2<T>(tNumber, switch_id<(8 * sizeof(T))>());
}
template <typename T, mword t_mwIndex>
inline void ClipToPower2(T& tNumber, switch_id<t_mwIndex>)
{
    ClipToPower2<T>((tNumber |= tNumber >> (t_mwIndex >> 1))
        , switch_id<(t_mwIndex >> 1)>());
}
template <typename T>
inline void ClipToPower2(T& tNumber, switch_id<0>)
{
    tNumber += 1;
}
полноценным заменителем первой функции? Я говорю о производительности... К сожалению нет под рукой профайлера, поэтому обращаюсь сюда.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.