Насколько медленны битовые поля в 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-битным. Если вы абсолютно сконцентрированы на сохранении всех возможных битов, посмотрите документацию для вашего компилятора по выравниванию и заполнению в структурах.

РЕДАКТИРОВАТЬ: Одна из причин для предпочтения битовых полей, хотя они в том, что они делают для более аккуратного кода, и важность поддерживаемости не следует недооценивать. По сравнению с временем программиста, компьютерное время дешево!

Общие советы для такого рода вопросов: создайте простую программу, сравнивающую вашу ситуацию как можно точнее (операции, оборудование и т. Д.) И измеряйте разницу в производительности самостоятельно.

В этом вопросе о битовых полях и маскировании я сомневаюсь, что вы увидите существенные различия в производительности - для кода битового поля может потребоваться сдвиг или два больше, чем маскирование, в зависимости от компилятора. Независимо от того, это заметно в вашем приложении или нет, вам нужно ответить. Например, существует большая разница во взглядах на программируемый маской встроенный код и настольные приложения.

Другие вопросы по тегам