Есть ли разница производительности при преобразовании к другому типу

Если коротко:

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 шт):

Автор решения: Serge3leo

Будет ли разница в перформансе при условной проверке 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. А с литералами, которые преобразуются взаимооднозначно, компиляторы, почти всегда, и так оптимально разбираются.

→ Ссылка