Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中保留一点用于区分联合类型+;_C++_Discriminated Union - Fatal编程技术网

C++ 在C+中保留一点用于区分联合类型+;

C++ 在C+中保留一点用于区分联合类型+;,c++,discriminated-union,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; 它是进行小规模优化

我目前有如下代码:

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;
它是进行小规模优化的数据结构尝试实现的一部分。虽然它可以在我的机器上使用我正在使用的编译器,但我知道不能保证每个结构中的两个标志位最终都在同一位中。即使他们这样做了,从不是最近编写的结构读取它在技术上仍然是未定义的行为。我想用这个位来区分当前存储的是这两种类型中的哪一种

在不增加工会规模的情况下,是否有一种安全、便携的方法来实现同样的目标?就我们而言,它不能大于16字节


如果不是,是否可以牺牲整个字节(第一个结构中为n,第二个结构中为buffer)而不是一位来实现它?

您的代码是特定于实现的。它在x86-64和ARM Aarch或PowerPC上可能有不同的行为。你关心便携性吗?阅读-C++11standard@BasileStarynkevitch这不是一个很有帮助的评论。OP明确表示他们关心可移植性,这个问题不难理解。为什么这个问题或任何其他问题的答案应该是“阅读整个C++11标准”?是的,我想知道是否可以通过便携方式实现类似的功能。@Daniel使用
std::variant
union
更好地满足您的要求(即,便携且标准化)。
variant
可以容纳多个类型,并且知道它在给定时间容纳的类型。但据我所知,
std::variant
总是会增加类型的大小。我的目标是保持在16字节以内,这是我尝试使用
变体时无法实现的。