我可以创建 类 的联盟吗
Can I create Union of classes
我有两个 类 用于通信,它们永远不会同时存在,但都将被使用。
示例:
class CommA
{
public:
void SendA();
...
private:
ProtocolA a;
...
}
class CommB
{
public:
void SendB();
...
private:
ProtocolB b;
...
}
是否可以将它们放在 Union 中以节省内存?
union CommAB
{
CommA a;
CommB b;
}
std::variant
已被其他人在评论和回答中提出。我将解释为什么这是推荐的方法。
关于工会,有一件重要的事情需要了解:工会中只有一名成员在任何时候都可以处于活动状态。如果你创建了一个AB
对象,它要么是a
,要么是b
,如果你访问错了,它就是UB。你怎么知道哪一个是活跃的?幸运的是,该标准提供了一些保证:如果所有联合成员中的 类 以相同的公共成员开头,您可以安全地访问它们。通常的技巧是让联合的所有 类 中的第一个成员来确定哪个是活跃的。另一个问题可能是当您有一个活跃的成员并且想要更改它时。
variant
的优点是它会处理这些实际方面,您不必担心,也不必调整成员的 类。
由于您正在寻找 space:联合采用其最大成员的 space。因此,如果您必须在 类 中添加一个普通的额外成员来跟踪活跃的联合成员,那么您的联合将比初始 A 或 B 更大。变体会为您完成工作,因此它会更大以及。
我有两个 类 用于通信,它们永远不会同时存在,但都将被使用。
示例:
class CommA
{
public:
void SendA();
...
private:
ProtocolA a;
...
}
class CommB
{
public:
void SendB();
...
private:
ProtocolB b;
...
}
是否可以将它们放在 Union 中以节省内存?
union CommAB
{
CommA a;
CommB b;
}
std::variant
已被其他人在评论和回答中提出。我将解释为什么这是推荐的方法。
关于工会,有一件重要的事情需要了解:工会中只有一名成员在任何时候都可以处于活动状态。如果你创建了一个AB
对象,它要么是a
,要么是b
,如果你访问错了,它就是UB。你怎么知道哪一个是活跃的?幸运的是,该标准提供了一些保证:如果所有联合成员中的 类 以相同的公共成员开头,您可以安全地访问它们。通常的技巧是让联合的所有 类 中的第一个成员来确定哪个是活跃的。另一个问题可能是当您有一个活跃的成员并且想要更改它时。
variant
的优点是它会处理这些实际方面,您不必担心,也不必调整成员的 类。
由于您正在寻找 space:联合采用其最大成员的 space。因此,如果您必须在 类 中添加一个普通的额外成员来跟踪活跃的联合成员,那么您的联合将比初始 A 或 B 更大。变体会为您完成工作,因此它会更大以及。