Оптимизация в MSVC 8.0
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 09.01.08 12:42
Оценка:
Вот такой маленький примерчик (не из реальной жизни — на досуге игрался) для инвертирования 64-битного целого:
__int64 qqq(char *b)
{
    __int64 i = 0;
    unsigned char *p = (unsigned char *)&i;

#if 0 //1-й вариант
    p[0] = b[7];
    p[1] = b[6];
    p[2] = b[5];
    p[3] = b[4];
    p[4] = b[3];
    p[5] = b[2];
    p[6] = b[1];
    p[7] = b[0];
#else //2-й вариант
    for (int j = 0, stop = sizeof(__int64); j < stop; ++j)
    {
        p[j] = b[stop - j - 1];
    }
#endif

    return i;
}

...
__int64 n = rand(), in;
in = qqq((char *)&n);

Что интересно — в обоих случаях генерируется абсолютно одинаковый ассемблер! И сама функция автоматически встраивается без указаний с моей стороны.
Приятно, блин. Ведь можно вообще написать что-нибудь типа:
template<class T>
T qqq(const char *b)
{
    T i = 0;
    char *p = (char *)&i;

    for (int j = 0, stop = sizeof(T); j < stop; ++j)
    {
        p[j] = b[stop - j - 1];
    }

    return i;
}


P.S. К чему я всё это: просто в последнее время со всех сторон на меня сыпятся высказывания об "убогости" С++ компилляторов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.