Насколько медленны битовые поля в C++
У меня есть приложение 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++. Я предполагаю, что они все еще быстрее, чем ручной код, показанный выше, но есть ли какой-либо жесткий справочный материал, освещающий влияние скорости на использование битовых полей на различных платформах, в частности, в 32-битных и 64-битных окнах. Приложение имеет дело с огромными объемами данных в памяти и должно быть быстрым и эффективным для использования памяти, что вполне может быть причиной того, почему он был написан таким образом.
3 ответа
Два примера должны быть очень похожими по скорости, потому что компилятору придется в конечном итоге выдавать практически одинаковые инструкции для битовой маскировки в обоих случаях. Чтобы узнать, что действительно лучше, проведите несколько простых экспериментов. Но не удивляйтесь, если результаты неубедительны; это то, что я предсказываю...
Вы могли бы лучше сказать, что битовые поля имеют тип bool
хоть.
Если это не очень-очень узкий цикл, между двумя вариантами производительности не будет выбора, если производительность действительно имеет значение, используйте bools (то есть, вероятно, 32-битные значения).
Использование структуры только с тремя однобитовыми полями, подобной этой, будет по меньшей мере 32-битным. Если вы абсолютно сконцентрированы на сохранении всех возможных битов, посмотрите документацию для вашего компилятора по выравниванию и заполнению в структурах.
РЕДАКТИРОВАТЬ: Одна из причин для предпочтения битовых полей, хотя они в том, что они делают для более аккуратного кода, и важность поддерживаемости не следует недооценивать. По сравнению с временем программиста, компьютерное время дешево!
Общие советы для такого рода вопросов: создайте простую программу, сравнивающую вашу ситуацию как можно точнее (операции, оборудование и т. Д.) И измеряйте разницу в производительности самостоятельно.
В этом вопросе о битовых полях и маскировании я сомневаюсь, что вы увидите существенные различия в производительности - для кода битового поля может потребоваться сдвиг или два больше, чем маскирование, в зависимости от компилятора. Независимо от того, это заметно в вашем приложении или нет, вам нужно ответить. Например, существует большая разница во взглядах на программируемый маской встроенный код и настольные приложения.