Есть ли разница производительности при преобразовании к другому типу
Если коротко:
short x = 10;
int y = x;
long z = x;
Есть ли разница?
Если не коротко:
Допустим некоторый тип any_t определяется макросом.
#ifdef USE_ANY_T_LONG
typedef long any_t
#else
typedef int any_t
#endif
Например есть non inline функция выполняющая некоторые операция и по итогу сравнивающая any_t и decimal например:
bool f(any_t x) {
/* code */
return any_t == 0;
}
Допустим мы изначально не знаем какой тип выберется для any_t, но предполагаем частое использование any_t like int. Я предполагаю, что при условной проверке эти типы должны кастоваться к одному типу от меньшего к большему. Будет ли разница в перформансе при условной проверке any_t == 0L и any_t == 0? Стоит ли заранее определять литерал более частого типа или обойтись использованием литерала доступного для всех decimal типов? Информации я не нашел, но предполагаю, что компилятор сам оптимизирует проверку. Для утоления моего интереса хотелось бы для общего ознакомления узнать ответ :)
Ответы (1 шт):
Будет ли разница в перформансе при условной проверке any_t == 0L и any_t == 0?
Если имелось ввиду bool f(any_t x) { return х == 0; } против bool f(any_t x) { return х == 0L; }, то нет, современные компиляторы и так разберутся.
Однако, если хочется облегчить компиляторам их тяжкий труд, то сделайте так, что бы автоматическое приведение типа применялось к литералу. Или вообще используйте any_t(0). ?
Стоит ли заранее определять литерал более частого типа или обойтись использованием литерала доступного для всех decimal типов?
Разве, что для типов плавающей точки, таки есть существенная потребность в шаблонах использовать что-то в духе T(0.42L), поскольку литерал надо дать с точностью до самого точного типа, а операцию провести с типом T. А с литералами, которые преобразуются взаимооднозначно, компиляторы, почти всегда, и так оптимально разбираются.