У меня есть эта функция, которая с учетом Gray code возвращает следующий код Grey. Вы можете найти более полное объяснение того, как это работает here. Дело в том, что я хотел сделать эту функцию приращения модульной, так что приращение кода серого, соответствующего UINT_MAX
, возвращает код серого, соответствующий 0
(соответственно самый старший бит и 0
). Поскольку это не поведение по умолчанию, я добавил чек для этого особого случая. Вот полный алгоритм:Использование __builtin_expected для проверки границ
unsigned next_gray(unsigned gray)
{
static const unsigned msb
= 1u << (CHAR_BITS - sizeof(unsigned) - 1u);
// gray is odd
if (__builtin_parity(gray))
{
if (__builtin_expect(gray == msb, false))
{
return 0u;
}
else
{
unsigned y = gray & -gray;
return gray^(y << 1u);
}
}
// gray is even
return gray^1;
}
Итак, фактический вопрос на самом деле о предсказании ветвления. Я часто читал, что __builtin_expect
должен использоваться только тогда, когда ветвь действительно может быть выбрана или действительно вряд ли будет выбрана, что является обычным примером для ускорения программы, когда ошибок нет.
Учитывая, что я не обрабатываю случай с ошибкой, я не уверен, что использование __builtin_expect
для проверки границ, как это, является хорошей идеей. Является ли это хорошим местом для использования __builtin_expect
или увеличивает максимальное значение, достаточно общую операцию для обмана прогноза ветвления?
Примечание: как всегда, комментарии и ответы подчеркнуть то, что не ясно, в моих вопросах :)
дам немного больше контекста: эта функция предназначается, чтобы быть частью библиотеки, разработанные для ради того, чтобы быть библиотекой и не использоваться каким-либо конкретным проектом, как знать. Поэтому добавление __builtin_expect
подразумевает, что я ожидаю, что люди будут в основном увеличивать другие значения, а затем максимальное значение; без какого-либо фактического проекта, я хочу знать, является ли это безопасным предположением.
Есть несколько интересных обсуждений по полезности этого в: [Есть ли намек компилятора для GCC, чтобы заставить предсказание ветвей всегда идти определенным образом?] (Http://stackoverflow.com/q/30130930/1708801) –