Как передать информацию о диапазоне компилятору C ++? - PullRequest
5 голосов
/ 13 декабря 2011

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

if(x < COMPILE_TIME_MIN or x > COMPILE_TIME_MAX)
    return;
// compiler will assume for code below that x is in range COMPILE_TIME_MIN..COMPILE_TIME_MAX

Но это проверка во время выполнения. Может быть, есть какая-то хитрость, чтобы заставить компилятор сделать предположение о диапазоне без такой проверки?

Ответы [ 3 ]

6 голосов
/ 13 декабря 2011

Любая такая «подсказка» будет зависеть от компилятора.

В качестве примера, Visual C ++ позволяет предоставить такую ​​подсказку, используя __assume intrinsic .

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

3 голосов
/ 13 декабря 2011

Это не стандартно, но с gcc приходит команда под названием __builtin_expect, с макросами, определенными как likely и unlikely, которые служат вашей цели. См. здесь , например, в котором говорится об их использовании в пространстве ядра, но __builtin_expect является расширением gcc и может также использоваться в пространстве пользователя (см. этот вопрос ), даже если likely и unlikely не определены.

0 голосов
/ 13 декабря 2011

Я не знаю каких-либо методов компиляции C ++, которые бы использовали эту информацию, но я знаю о различных методах статического анализа, которые это делают; общий способ «сказать» что-то этим инструментам будет через assert s, например:

assert(x > COMPILE_TIME_MIN);
assert(x < COMPILE_TIME_MAX);

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

Кроме того, если диапазон действительно мал, вы также можете представить его в переменной меньшего размера - например, используя short или char - и добавляя COMPILE_TIME_MIN. Это может помочь таким инструментам, хотя я не знаю о самой компиляции.

И, наконец, как и во всех подходах к оптимизации, я бы порекомендовал сначала профилировать ваш код, чтобы посмотреть, не может ли это стать узким местом. Кроме того, имейте в виду, что компиляторы предназначены для оптимизации «нормального» кода - ручная оптимизация, безусловно, может помочь, просто делайте это осторожно.

...