У меня есть приложение C++, которое включает много структур с вручную управляемыми битовыми полями, чем-то как
#define FLAG1 0x0001
#define FLAG2 0x0002
#define FLAG3 0x0004
class MyClass
{
'
'
unsigned Flags;
int IsFlag1Set() { return Flags & FLAG1; }
void SetFlag1Set() { Flags |= FLAG1; }
void ResetFlag1() { Flags &= 0xffffffff ^ FLAG1; }
'
'
};
По очевидным причинам я хотел бы изменить это для использования битовых полей, чего-то как
class MyClass
{
'
'
struct Flags
{
unsigned Flag1:1;
unsigned Flag2:1;
unsigned Flag3:1;
};
'
'
};
Одно беспокойство, которое я имею с созданием этого переключателя, - то, что я столкнулся со многими ссылками на этом сайте, указывающем, как медленные битовые поля находятся в C++. Мое предположение - то, что они еще быстрее, чем ручной код, показанный выше, но есть ли любой твердый ссылочный материал, покрывающий последствия скорости использования битовых полей на различных платформах, конкретно окнах на 64 бита и на 32 бита. Соглашения о приложении с огромными объемами данных в памяти и должны быть и быстро и эффективная память, который мог быть, почему она была записана этот путь во-первых.
Эти два примера должны быть очень похожи по скорости, потому что компилятору придется в итоге выдавать практически одинаковые инструкции для битовой маскировки в обоих случаях. Чтобы узнать, какой из них действительно лучше, проведите несколько простых экспериментов. Но не удивляйтесь, если результаты окажутся неубедительными; именно это я и предсказываю...
Возможно, лучше сказать, что битовые поля имеют тип bool
.
Общий совет для такого рода вопросов: создайте простую программу, сравнивающую вашу ситуацию как можно точнее (операции, оборудование и т. Д.), И измерьте ваши разница в производительности самостоятельно.
Что касается этого вопроса о битовых полях и маскировке, я сомневаюсь, что вы увидите существенные различия в производительности - для кода битового поля может потребоваться сдвиг или два больше, чем при маскировании, в зависимости от компилятора. Заметно это в вашем приложении или нет, вам нужно ответить. Например, существует большая разница в соображениях относительно программируемого по маске встроенного кода и настольных приложений.
Если только это не будет в очень-очень-очень плотном цикле, будет не из чего выбирать между двумя по производительности , если производительность действительно имеет значение, используйте логические значения (то есть, вероятно, 32-битные значения).
Использование структуры только с тремя однобитными полями, подобными этой, все равно будет дополнять как минимум 32-битными. Если вы полностью сконцентрированы на сохранении каждого возможного бита, посмотрите документацию для вашего компилятора по выравниванию и заполнению в структурах.
РЕДАКТИРОВАТЬ: Одна из причин отдавать предпочтение битовым полям заключается в том, что они делают код более аккуратным, и не следует недооценивать важность ремонтопригодности. По сравнению с временем программиста, компьютерное время дешево!