c++ - 编译器是否避免中间整数提升或转换?

标签 c++ c++11 casting integer compiler-optimization

考虑这样一个类:

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/

相关文章:

不调用 C++ 析构函数

c++ - 在 vector 中存储模板化对象指针并通过基类指针访问

c# - 枚举未设置时会发生什么?

java - 在java中将浮点位解释为long?

Java 将对象动态转换为实体

c++ - 为什么这个程序在调用函数时会出现段错误?

c++ - 通过 C 接口(interface)传递 C++ i/o 类的特定于编译器的问题

c++ - 如何将 boost 字节数组转换为结构体

c++ - 为什么不能使用 '( )' 为类的非静态数据成员赋予默认值?

c++ - 将自定义比较器重载到 std::map