c++ - 编译器对屏蔽类没有常量折叠
问题描述
对于嵌入式项目,我使用辅助类作为标志和掩码。由于未知原因,掩码类的代码未按预期正确折叠。
掩码的最小实现如下所示:
template<typename Enum, typename MaskValue>
class EnumMask
{
public:
constexpr inline EnumMask() noexcept : _mask(0) {}
constexpr inline EnumMask(Enum enumValue) noexcept : _mask(maskFromEnum(enumValue)) {}
constexpr inline EnumMask(const std::initializer_list<Enum> enumValues) noexcept : _mask(maskFromEnum(enumValues.begin(), enumValues.end())) {}
constexpr inline operator MaskValue() const noexcept { return _mask; }
private:
constexpr static inline MaskValue maskFromEnum(const Enum enumValue) noexcept {
return (static_cast<MaskValue>(1)<<static_cast<uint8_t>(enumValue));
}
constexpr static inline MaskValue maskFromEnum(
typename std::initializer_list<Enum>::const_iterator it,
typename std::initializer_list<Enum>::const_iterator end) noexcept
{
return (it == end ? static_cast<MaskValue>(0) : (maskFromEnum(*it)|maskFromEnum(it+1, end)));
}
private:
const MaskValue _mask;
};
该类的使用如以下示例所示:
class Driver
{
public:
enum Pin : uint8_t {
GPA0 = 0x00,
GPA1 = 0x01,
GPA2 = 0x02,
};
typedef EnumMask<Pin, uint16_t> PinMask;
void setPinDirection(const uint16_t mask, bool direction);
inline void setPinDirection(const PinMask &mask, bool direction) {
setPinDirection(static_cast<uint16_t>(mask), direction);
}
};
void main()
{
Driver d;
d.setPinDirection({Driver::GPA0, Driver::GPA1}, true);
}
代码使用 GCC 4.8.3 编译,带有选项-Os
. 我希望,编译器会将此代码解析为单个值,但它实际上会创建一个函数来根据这些值计算掩码。
我的代码中是否有特殊原因阻止了正确的 const 折叠?
解决方案
推荐阅读
- node.js - 函数附加类型号
- c# - 将布局表单发送到其他页面时出现问题?
- android - Can a jar library bound via Xamarin.Bindings library project start a service in Xamarin.Android project?
- java - 创建类的“变体”同时仍保持java中的类层次结构的简洁方法?
- .net - 如何直接部署在 Azure 应用服务中完成的代码更改
- css - Correct way to import CSS when using SSR React?
- php - 图片点击php打开另一个php站点并将图片href发送到第二个php
- python - 带有 pyinstaller 的文档(.docx)
- bash - 如何传递文件我使用 grep 到 sed 和 -n 切换到替换文件
- amazon-ec2 - 保存密码的 SSH 或 MobaXterm 到 AWS EC2 实例不起作用