我想有一个类型,就像unsigned char
:
- sizeof是1
- 整数值可以分配给它(没有任何类型转换)
- 允许位操作
- 算术是允许的,但不是必须的
- 无符号
- 可简单复制的
但是,与unsigned char
不同,它不允许别名。我的意思是,一个类型,它没有异常[basic.lval/11.8]:
如果一个程序试图通过非以下类型的glvalue访问对象的存储值,则行为未定义:
[...]
- char、unsigned char或std::字节类型。
有可能有这样的类型吗?
原因是:我几乎从不使用unsigned char
的aliasing属性。所以,我想使用一种类型来代替,它不会阻止某些类型的优化(注意,我问这个问题是因为我实际上有一些函数,由于unsigned char
的允许别名属性,这些函数没有很好地优化)。所以,我想有一个类型,这是真的:“不要为你不用的东西付钱”。
下面是一个例子,其中unsigned char
阻止优化:Using this pointer causes strange deoptimization in hot loop
3条答案
按热度按时间j8ag8udp1#
标准的这一部分调用了
char
、unsigned char
和std::byte
。但是,你可以创建自己的类型,比如std::byte
,它不允许别名:使用它并不是那么好,因为你必须强制转换为
unsigned char
才能用它做任何有意义的事情。但是,您可以重载位运算符和算术运算符,使其更易于使用。我们可以用下面的简单函数来验证这一点:
如果
A
被允许与B
别名,编译器将不得不生成两个加载:一个用于lhs
,一个用于rhs
。如果不允许A
与B
别名,编译器可以生成一个单一的加载,并将值添加到自身。Let's test it:结果如下:
因此,
my_byte
不继承与char
和std::byte
相同的别名属性w6mmgewl2#
您可以定义自己的类型:
mfpqipee3#
C++的别名规则,包括它的“字符类型”例外,都是从C的那些规则衍生而来的,这些规则基于几个相对没有争议的原则:
1.给定一个结构,如:
不应该要求编译器适应
*p
可能标识与x
相同的存储的可能性。1.一个结构,如:
应该可用于任何数据类型,并且应该可以编写可互换地对有符号和无符号数据进行操作的代码。
虽然标准没有强制要求这样做,但我认为大多数人都会同意,在
char
是8位的实现中,应该和
unsigned char
版本一样好用。该标准将允许一种实现,该实现能够支持至少模糊地类似于上述
dump_hex2
的结构,而不必悲观地适应与宇宙中任何地方的每个uint8_t*
相关的所有场景,能够识别每种类型的每个可寻址对象的一部分,但不幸的是,它并不要求实现做出哪怕是最轻微的努力来支持这样的构造。尽管如此,这可能是最接近于与现有实现兼容的结构,但允许实现寻求有效地适应程序员需要执行的任务,以生成比其他方式更有效的代码。