编译器是否避免中间积分提升或转换
Do compilers avoid intermediate integral promotion or conversions?
考虑一个类,如:
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函数的调用。
相关文章:
- 是否可以从int转换为enum类类型
- 隐式转换是否应该在模板参数的上下文中工作?
- C++ stod:字符串到浮点转换是否一致
- 自动(toCast)显式转换是否计划在未来C++标准?
- 类类型的左值到右值转换:是否涉及复制?
- 矢量之间的转换是否定义了行为
- 如何检测 W2A 转换是否完全成功
- interpret_cast和c样式强制转换是否兼容(按照c++标准)
- 仅更改常量性的指针强制转换是否可以调用未定义的行为
- C++ 强制转换是否会创建新对象
- 在类树中使用动态强制转换是否可以接受
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 检查显式强制转换是否成功
- 如果派生类只包含方法(没有成员变量),向下强制转换是否安全?
- 使用这种智能指针强制转换是否安全?
- 类型转换是否消耗额外的CPU周期?
- 在void*和void*之间进行强制转换时,混合使用静态强制转换和重新解释强制转换是否不安全?
- 类型转换是否在内部使用条件?(C / c++, c#)
- 如何检测转换是否在 c++0x 中失败
- 如何在CRTP中实现向下转换是否有效的编译时检查