Мне интересно, какой самый удобный способ проверить, является ли сдвиг вправо арифметическим при работе со знаковыми типами (например, -2 >> 1
равен -1
) во время компиляции.
Моя идея состоит в том, чтобы как-то проверить это во время компиляции и быть в состоянии обнаружить это, чтобы я мог скомпилировать разные версии функции (в зависимости от того, действительно ли оператор >>
является арифметическим сдвигом или нет).
Читая тему
Проверка того, что C / C ++ смещение вправо со знаком является арифметикой для определенного компилятора? Я пришел к идее инициализировать флаг
static const bool is_arithmetic_rs = (((signed int)-1)>>1) == ((signed int)-1));
и проверить его во время выполнения следующим образом:
if (is_arithmetic_rs) {
// some fast algorithm using arithmetic right shifts (using >> operator)
} else {
// the same algorithm without arithmetic right shifts (much slower)
}
Однако я бы хотел избегать этого ветвления, если это возможно каждый раз. Для простоты предположим, что я хочу реализовать переносное арифметическое смещение вправо; если бы мне приходилось проверять это каждый раз при вызове функции, это оказало бы огромное влияние на производительность, поэтому я хотел бы сделать это во время компиляции, если это возможно.
Если не существует переносимого способа сделать эту проверку, есть ли способ сделать это, проверив на основе максимальных усилий, например, проверяя с помощью ifdefs для определенного компилятора / платформы?