整数提升带来的 std::byte 开销

Lin*_*gxi 6 c++ type-conversion integer-promotion c++17 std-byte

考虑unsigned char v进行一系列按位运算并将结果存储回 的情况v。在底层,它被整数提升一次,经历一系列操作,结果被截断并存储回v

然而std::byte v,对于每个操作,操作数首先被提升为整数,进行操作,并且(中间)结果被截断并存储回某个std::byte。这将是许多来回的提升和截断。这都是概念性的,但它会在实践中造成真正的开销吗?

人工例子

// `mask` and `lshf` are of type `unsigned`
unsigned char v = ...;
v = (v & mask) << lshf; // one promotion at `&` and one truncation at `=`
Run Code Online (Sandbox Code Playgroud)
// `mask` and `lshf` are of type `std::byte` and `unsigned`
std::byte v = ...;
v = (v & mask) << lshf;

// It would be like
// byte(unsigned(byte(unsigned(v) & unsigned(mask))) << lshf)
Run Code Online (Sandbox Code Playgroud)

真实案例

假设我们要将一个字节的前 3 位清零。

unsigned char v = ...;
v = (v << 3 & 0xff) >> 3;
Run Code Online (Sandbox Code Playgroud)

std::byte v = ...;
v = v << 3 >> 3;
Run Code Online (Sandbox Code Playgroud)