Документация для __ принимает, говорит, что "Наиболее популярный способ использования __ принимает, со случаем по умолчанию оператора переключения, как показано в следующем примере"..
Я не мог найти любой нетривиальный пример, который покажет любой из вышеупомянутых - я надеюсь, что кто-то еще мог.
Рассмотрим следующий код, скомпилированный с переключателем / 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 < б).