Как дать компилятору подсказка о максимальном времени выполнения цикла

// if I know that in_x will never be bigger than Max
template <unsigned Max>
void foo(unsigned in_x)
{
    unsigned cap = Max;

    // I can tell the compiler this loop will never run more than log(Max) times
    for (; cap != 0 && in_x != 0; cap >>= 1, in_x >>= 1)
    {
    }
}

Как показано в приведенном выше коде, я предполагаю, что если я просто напишу

for (; in_x != 0; in_x >>= 1)

компилятор не будет разворачивать цикл, так как не может быть уверен в максимально возможном in_x.

Я хочу знать, прав я или нет, и есть ли какие-то лучшие способы справиться с такими вещами.


Или, может быть, проблему можно обобщить, как если бы можно было написать некоторый код, сообщающий компилятору диапазон некоторого значения времени выполнения, и такой код не обязательно компилируется в двоичный файл времени выполнения.


Верно, боремся с компилятором XD

// with MSC
// if no __forceinline here, unrolling is ok, but the function will not be inlined
// if I add __forceinline here, lol, the entire loop is unrolled (or should I say the tree is expanded)...
// compiler freezes when Max is something like 1024
template <int Max>
__forceinline void find(int **in_a, int in_size, int in_key)
{
    if (in_size == 0)
    {
        return;
    }

    if (Max == 0)
    {
        return;
    }

    {
        int m = in_size / 2;

        if ((*in_a)[m] >= in_key)
        {
            find<Max / 2>(in_a, m, in_key);
        }
        else
        {
            *in_a = *in_a + m + 1;

            find<Max - Max / 2 - 1>(in_a, in_size - (m + 1), in_key);
        }
    }
}
5
задан BlueWanderer 3 March 2012 в 17:04
поделиться