Dan*_*iel 5 c++ discriminated-union
我目前的代码如下所示:
union {
struct {
void* buffer;
uint64_t n : 63;
uint64_t flag : 1;
} a;
struct {
unsigned char buffer[15];
unsigned char n : 7;
unsigned char flag : 1;
} b;
} data;
Run Code Online (Sandbox Code Playgroud)
它是进行小尺寸优化的数据结构的尝试实现的一部分。虽然它在我的机器上使用我正在使用的编译器工作,但我知道不能保证每个结构的两个标志位实际上最终在同一位。即使他们这样做了,从最近未编写的结构中读取它在技术上仍然是未定义的行为。我想用这个位来区分当前存储的两种类型中的哪一种。
是否有一种安全且便携的方法可以在不增加工会规模的情况下实现同样的目标?对于我们的目的,它不能大于 16 个字节。
如果没有,是否可以通过牺牲整个字节(第一个结构中的 n 和第二个结构中的缓冲区)而不是一点来实现?