Мне нужен 2-битный массив, меня вообще не интересует экономия памяти, но меня интересует минимизация промахов кеша и максимизация эффективности кеша. Использование массива логических значений потребует в 4 раза больше памяти, а это означает, что на каждый пригодный для использования кусок данных в кеше будет 3 неиспользуемых. Так что технически я могу получить в 3 раза лучшую согласованность кеша, если буду использовать битовые поля.
План состоит в том, чтобы реализовать его в виде массива байтов, разделенного на 4 равных битовых поля, и использовать функцию div, чтобы получить целое частное и остаток, возможно, за один такт, и использовать их для доступа к правильному индексу и правому битовое поле.
Массив, который мне нужен, имеет длину около 10000 элементов, поэтому он обеспечит значительно более плотную упаковку данных, использование 2 фактических битов позволит разместить весь массив в кеше L1, а при использовании массива байтов это будет невозможно.
Итак, мой вопрос: может ли кто-нибудь сказать мне, является ли это хорошей идеей в задаче, ориентированной на производительность, поэтому я знаю, стоит ли идти дальше и реализовывать 2-битный массив? И, конечно же, лучший способ узнать это — профилирование, но любая информация заранее может быть полезной и будет оценена по достоинству.
&
,|
) вместо деления и остатка для упаковки и распаковки. - person Jerry Coffin   schedule 20.01.2013struct A4 { unsigned char x1:2; etc }
и позволил компилятору заниматься оптимизацией. - person Marc Glisse   schedule 20.01.2013x & 0x03
— это более ясный способ сказать два младших значащих бита x, чем использование деления и остатка, но я < я>предполагаю, что другие могут не согласиться (я полагаю, особенно те, у кого больше опыта в математике и меньше в аппаратном обеспечении). - person Jerry Coffin   schedule 20.01.2013