Насколько медленный битовые поля в 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++. Мое предположение - то, что они еще быстрее, чем ручной код, показанный выше, но есть ли любой твердый ссылочный материал, покрывающий последствия скорости использования битовых полей на различных платформах, конкретно окнах на 64 бита и на 32 бита. Соглашения о приложении с огромными объемами данных в памяти и должны быть и быстро и эффективная память, который мог быть, почему она была записана этот путь во-первых.

11
задан SmacL 14 April 2010 в 14:09
поделиться

3 ответа

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

Возможно, лучше сказать, что битовые поля имеют тип bool.

5
ответ дан 3 December 2019 в 09:40
поделиться

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

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

1
ответ дан 3 December 2019 в 09:40
поделиться

Если только это не будет в очень-очень-очень плотном цикле, будет не из чего выбирать между двумя по производительности , если производительность действительно имеет значение, используйте логические значения (то есть, вероятно, 32-битные значения).

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

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

5
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: