у меня есть это
return sqrt(a-b);
и я знаю, что а больше, чем б. Как я могу дать знать компилятору?
Компилятору пофиг. Из «man sqrt» в Linux:
Функция sqrt () возвращает неотрицательный квадратный корень из x. Это
терпит неудачу и устанавливает errno в EDOM, если x отрицателен.
Если вы хотите, чтобы компиляция не удалась, если a-b не является постоянной времени компиляции или отрицательной постоянной времени компиляции, вы можете использовать static_assert или BOOST_STATIC_ASSERT, в зависимости от того, что доступно в вашей среде:
static_assert(a - b > 0.0, "a must be > b");
return sqrt(a - b);
Просто напишите это как есть. Компилятору не нужно знать эту информацию.
sqrt
предназначен для обработки условия, когда аргумент -ve
,
Если аргумент отрицательный, глобальная переменная errno
будет установлено значение EDOM
,
Если ты пишешь if !(a > b) return 0;
на предыдущей строке компилятор в принципе может сделать вывод, что a > b
на вашей линии. Имеет ли это знание какое-то значение, конечно, полностью зависит от компилятора.
Кроме того, будет ли это полезным для вас, зависит, как вы думаете, что это может изменить. Если вы надеетесь дать подсказку по оптимизации, то, вероятно, это не поможет, поскольку тест все равно будет выполнен. Вы должны намекать каким-то образом, специфичным для компилятора (при условии, что ваш компилятор предоставляет способ). Я не проверял это, но, например, в GCC вы надеетесь, что если вы это сделаете:
if (a > b) {
return sqrt(a-b);
} else {
__builtin_unreachable();
}
тогда оптимизатор будет (а) знать, что a > b
когда он звонит sqrt
и (б) не выполнять a > b
тест, поскольку он знает, что возможен только один результат.