考虑这样一个类:
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 with cast对比Clang with direct reference to field
Gcc with cast对比Gcc with direct reference to field
虽然情况略有不同,但 Clang 会执行 manage to optimize对 cast 函数的调用。
关于c++ - 编译器是否避免中间整数提升或转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351441/