编译器是否避免中间积分提升或转换

Do compilers avoid intermediate integral promotion or conversions?

本文关键字:转换 是否 中间 编译器      更新时间:2023-10-16

考虑一个类,如:

struct mystruct 
{
    constexpr operator char() {return x;}
    signed char x;
};

以及类似的操作

mystruct m;
m.x = /* something at runtime */
int i = 3 * m + 45ULL * m;

编译器是否能够跳过到char的临时转换,直接将m转换为3 * m + 45ULL * m表达式中所需的类型?

GCC 5.3.0版似乎能够优化对cast函数的调用,而Clang 3.7则没有那么聪明。

对于这段代码:

struct mystruct 
{
    constexpr operator char() const {return x;}
    signed char x;
} m;
void func(const int num) {
  m.x = num*2;
  int i = 3 * m + 45ULL * m;
}

您可以检查已编译的程序集并进行比较:

铸造Clang与直接参考现场的Clang

铸造Gcc与直接参考现场的Gcc

尽管情况略有不同,Clang还是设法优化了对cast函数的调用。