【发布时间】:2019-02-13 18:45:07
【问题描述】:
我想要一个类型,比如unsigned char:
- sizeof 为 1
- 可以为其分配整数值(无需任何强制转换)
- 允许位操作
- 算术是允许的,但不是必须的
- 未签名
- 可轻松复制
但是,与unsigned char 不同的是,它不允许别名。我的意思是,一个类型,它没有异常[basic.lval/11.8]:
如果程序尝试通过以下类型之一以外的左值访问对象的存储值,则行为未定义:
[...]
- char、unsigned char 或 std::byte 类型。
有可能有这样的类型吗?
原因:我几乎从不使用unsigned char 的别名属性。所以,我想改用一个类型,它不会阻止某些类型的优化(注意,我问这个问题是因为我实际上有一些函数,由于 @ 的别名允许属性,这些函数没有得到很好的优化987654327@)。所以,我想有一个这样的类型:“不要为你不使用的东西买单”。
这是一个示例,其中unsigned char 阻止优化:Using this pointer causes strange deoptimization in hot loop
【问题讨论】:
-
static_assert std::uint8_t 可用。
-
@RichardCritten
std::uint8_t不会有太大帮助,因为大多数实现 typedef 它是unsigned char。 // 编辑:stackoverflow.com/questions/16138237/… -
为什么整数值可以分配给它没有强制转换如此重要,以至于您可以编辑问题以响应需要它的解决方案?我想不出为什么写
some_type{n}而不是n会破坏交易 -
@Justin:“可以为它分配整数值”。对我来说,它已经意味着
a = 42;,没有演员表。对于您的解决方案,“可以为其分配整数值”是不正确的。你转换它,所以你分配一个枚举,而不是一个整数。我已经编辑了这个问题,以明确这一点,而不是抹黑你的答案。 -
您可以使用几个
#ifdef和restrict、__restrict或__restrict__。