编译器是否避免中间整体推广或转换?

Vin*_*ent 5 c++ integer casting compiler-optimization c++11

考虑一个类:

struct mystruct 
{
    constexpr operator char() {return x;}
    signed char x;
};
Run Code Online (Sandbox Code Playgroud)

和一个像这样的操作:

mystruct m;
m.x = /* something at runtime */
int i = 3 * m + 45ULL * m;
Run Code Online (Sandbox Code Playgroud)

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

Ily*_*nov 0

看来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;
}
Run Code Online (Sandbox Code Playgroud)

您可以检查编译的程序集并比较它们:

带强制转换的 Clang直接引用字段的 Clang

带强制转换的 Gcc直接引用字段的 Gcc

尽管在稍微不同的情况下,Clang 确实设法优化了对强制转换函数的调用。