Некоторый пример __ принимает продвижение к более быстрому коду кроме “никакого значения по умолчанию” в переключателе?

Документация для __ принимает, говорит, что "Наиболее популярный способ использования __ принимает, со случаем по умолчанию оператора переключения, как показано в следующем примере"..

  • Есть ли какой-либо другой случай, где __ принимают, может привести к более эффективному (или даже другое) код?
  • Когда в, если / еще, компилятор автоматически "принимает" то, что уже, знают из-за если условие?

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

8
задан Suma 22 June 2010 в 20:37
поделиться

1 ответ

Рассмотрим следующий код, скомпилированный с переключателем / Ox :

if (1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

Оптимизатор оптимизирует else . Теперь рассмотрим:

int x = 1;
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

Оптимизатор снова оптимизирует else . Также учтите:

int x = 1;
__assume(x != 1);
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

Оптимизатор будет оптимизировать , если на этот раз - неправильно.

Для тестирования создайте тестовую программу в режиме Release (с параметрами / Ox и / Zi ) и посмотрите на созданную сборку ( Alt + 8 ] в Visual Studio.)

Теперь рассмотрим приведенное выше условие if / else , которое проверяется встроенным методом. В определенных контекстах программист может знать, что встроенный метод вызывается с определенным значением, и оптимизатор, возможно, не осознал этот факт. Использование __ accept на уровне вызывающего объекта, как показано выше, непосредственно перед вызовом встроенного метода, теоретически может помочь оптимизатору.

Из Рекомендации по оптимизации :

__ Предположим, был в Visual C ++ для несколько выпусков, но он стал гораздо удобнее в Visual C ++ 2005. С помощью __assume разработчик может сказать компилятор, чтобы сделать предположения о значение некоторой переменной.

Например, __assume (a <5); говорит оптимизатор, который в этой строке кода переменная a меньше 5. И снова это обещание компилятору. Если а на самом деле 6 в этот момент в программа то поведение программа после того, как компилятор оптимизированный может быть не тем, что вы бы ожидать.__assume является наиболее полезным до для переключения операторов и / или условные выражения.

Есть некоторые ограничения на __предполагать. Во-первых, как и __restrict, это всего лишь предложение, поэтому компилятор может игнорировать это. Также __assume в настоящее время работает только с переменной неравенства по отношению к константам. Это не распространяет символический неравенства, например, полагаем (a < б).

8
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

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