Что самое трудное для понимания кода С++, который вы знаете?

Сегодня на работе мы натолкнулись на следующий код (некоторые из вас могут его распознать):

#define GET_VAL( val, type ) \
    {                                                   \
        ASSERT( ( pIP + sizeof(type) ) <= pMethodEnd ); \
        val = ( *((type *&)(pIP))++ );                  \
    }

В основном мы имеем массив байтов и указатель. Макрос возвращает ссылку на переменную типа и продвигает указатель до конца этой переменной.

Это напомнило мне несколько раз, что мне нужно было "думать как парсер", чтобы понять код на С++.

Знаете ли вы о других примерах кода, которые заставили вас остановиться и прочитать его несколько раз, пока вам не удалось понять, что он должен делать?

Ответы

Ответ 1

реализация обратного квадратного корня в Quake 3:

float InvSqrt (float x){
    float xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i>>1);
    x = *(float*)&i;
    x = x*(1.5f - xhalf*x*x);
    return x;
}

Update: Как это работает (спасибо ryan_s)

Ответ 3

Устройство Duff (http://en.wikipedia.org/wiki/Duff%27s_device) дает мне кошмары:

strcpy(to, from, count)
char *to, *from;
int count;
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
               } while (--n > 0);
    }
}

Ответ 5

unsigned int reverse(register unsigned int x)
{
 x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
 x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
 x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
 x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
 return((x >> 16) | (x << 16));
}

Отменяет порядок бит в int.

Ответ 6

Это хорошо известный, но все же впечатляющий способ обмена двумя целыми числами без создания временной переменной:

// a^=b^=a^=b;     // int a and int b will be swapped
// Technically undefined behavior as variable may only 
// be assined once within the same statement.
// 
// But this can be written correctly like this.
// Which still looks cool and unreadable ;-)

a^=b;
b^=a;
a^=b;

Ответ 7

Большинство файлов Boost - метапрограммирование шаблона достаточно плохое, но когда вы учитываете обходные пути, необходимые для работы над некоторыми компиляторами (* coughborlandcough *), это становится довольно смешно. Просто попробуйте понять Boost.Bind. Просто попробуйте.

Ответ 8

C, но присутствует в С++, я считаю, что оператор запятой действительно запутывает код, возьмите это...

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);

Тесный и довольно элегантный, но очень легко пропустить или понять неправильно.

Ответ 10

Двоичные смены меня все время путают:

Пример из java.util.concurrent.ConcurrentHashMap:

return ((h < 7) - h + (h → > 9) + (h → > 17))

Ответ 11

Я проголосую за метапрограммирование черной магии и хакерских шаблонов (к сожалению, у него нет наготове, чтобы опубликовать его).