‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

С другой стороны, Си так же неисчерпаем, как и атом.

char *name = &((uint8_t*)&c->car)[1];

получает указатель на поле car структуры c, трактует его как указатель на массив байтов, индексирует второй байт этого массива и берёт его указатель. В итоге мы видим чудесным образом сохранённую строку длиной до двух байт (увы! z-байт тоже надо хранить в C-style строках, а в байте с индексом 0 лежал тэг: итого, два байта неизбежно отлетают под служебные данные, из-за чего 64-битные машины начинают выглядеть чуточку выгоднее), для размещения которой вовсе не потребовалось выделять отдельно память.

Шо то мне подсказывает, что на машинах с big-endianness сие работать не будет, но доступных одноплатников с PowerPC я нигде не смог откопать.

Сделать трёхбайтовые строки можно, но тогда тэг должен лежать в СТАРШЕМ байте, а не в младшем, как сейчас, и будет равен нулю для таких вот спрятанных строк (тогда этот тэг автоматически становится z-байтом). В принципе, ничего страшного нет, просто физические указатели, при записи их в такие структуры, придётся сдвигать вниз на ширину тэга (а при чтении, соотв., выдвигать вверх). Учитывая наличие barrel shift в большинстве современных чипов, это будет ничуть не более дорогая операция, нежели чем наложение битовой маски.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments