Я был взволнован, когда constexpr был представлен в C ++ 11, но, к сожалению, я сделал оптимистические предположения о его полезности. Я предположил, что мы можем использовать constexpr где угодно, чтобы поймать буквальные константы времени компиляции или любой результат constexpr буквальной константы времени компиляции, включая что-то вроде этого:
constexpr float MyMin(constexpr float a, constexpr float b) { return a<b?a:b; }
Поскольку определение типа возвращаемого значения функции только как constexpr не ограничивает его использование во время компиляции, а также должно быть вызываемым во время выполнения, я решил, что это будет способ гарантировать, что MyMin может когда-либо использоваться только с константами, оцениваемыми во время компиляции. , и это гарантировало бы, что компилятор никогда не разрешит его выполнение во время выполнения, давая мне возможность написать альтернативную, более удобную для времени выполнения версию MyMin, в идеале с тем же именем, которое использует внутренний _mm_min_ss, гарантируя, что компилятор не будет генерировать ветвление во время выполнения код. К сожалению, параметры функции не могут быть constexpr, поэтому может показаться, что это невозможно сделать, если только что-то подобное не было возможно:
constexpr float MyMin(float a, float b)
{
#if __IS_COMPILE_TIME__
return a<b?a:b;
#else
return _mm_cvtss_f32(_mm_min_ss(_mm_set_ss(a),_mm_set_ss(b)));
#endif
}
Я серьезно сомневаюсь, что в MSVC ++ есть что-то подобное, но я надеялся, что, возможно, GCC или clang найдут хоть что-то для этого, как бы неэлегантно это ни выглядело.
Конечно, представленный мною пример был очень упрощенным, но если вы можете использовать свое воображение, есть много случаев, когда вы можете свободно делать что-то вроде широкого использования операторов ветвления в функции, которая, как вы знаете, может выполняться только во время компиляции, потому что, если он выполняется во время выполнения, производительность будет скомпрометирована.
constexpr
во время компиляции или во время выполнения. С другой стороны,a < b ? a : b
вообще не выполняет ветвления, компилятор сгенерирует команду условного перемещения. - person plasmacel   schedule 03.11.2016vcmpeqss
иvblendvps
без какого-либо ветвления. Для целей до AVX он будет реализовывать то же самое, используяcmpeqss
andps
andnps
orps
- person plasmacel   schedule 03.11.2016