C++ 最好使用结构的union instread的场景

C++ 最好使用结构的union instread的场景,c++,struct,unions,C++,Struct,Unions,有人能给我一些场景,在一些问题中使用union而不是struct是明智的吗 感谢每当您遇到数据瓶颈,并且您有两个相互排斥但在同一数据结构中可用的数据段时,使用联合是明智的 假设我有两条消息具有相同的数据,除了两条数据在它们之间是互斥的,并且大小相近(一个32位int和一个4字节数组)。我可以将两者合并,消息可以共享数据结构,而不会增加它们不会使用的大小 注意以下问题: 这些数据将来可能不会相互排斥。 互斥数据的初始化。 对两条消息重复使用相同的数据实例(您需要确保切换出互斥数据,或者接收方处理垃

有人能给我一些场景,在一些问题中使用union而不是struct是明智的吗


感谢

每当您遇到数据瓶颈,并且您有两个相互排斥但在同一数据结构中可用的数据段时,使用联合是明智的

假设我有两条消息具有相同的数据,除了两条数据在它们之间是互斥的,并且大小相近(一个32位int和一个4字节数组)。我可以将两者合并,消息可以共享数据结构,而不会增加它们不会使用的大小

注意以下问题:

这些数据将来可能不会相互排斥。 互斥数据的初始化。 对两条消息重复使用相同的数据实例(您需要确保切换出互斥数据,或者接收方处理垃圾数据)

使用联合引用具有不同类型定义的相同数据是未定义的行为。因此:

  • 不要使用联合来欺骗类型系统
  • 不要使用联合来存储指针和访问引用
  • 不要使用活接头来创建更便宜的类型铸造
另外,不要将union与可以从代码中的另一点删除的指针数据一起使用。您的联合中可能有一个已删除的指针,并且意外地使用其他定义引用了数据


最重要的是,如果你不明白这个答案不要使用联合。

当您遇到数据瓶颈,并且您有两个相互排斥但在同一数据结构中可用的数据时,最好使用联合

假设我有两条消息具有相同的数据,除了两条数据在它们之间是互斥的,并且大小相近(一个32位int和一个4字节数组)。我可以将两者合并,消息可以共享数据结构,而不会增加它们不会使用的大小

注意以下问题:

这些数据将来可能不会相互排斥。 互斥数据的初始化。 对两条消息重复使用相同的数据实例(您需要确保切换出互斥数据,或者接收方处理垃圾数据)

使用联合引用具有不同类型定义的相同数据是未定义的行为。因此:

  • 不要使用联合来欺骗类型系统
  • 不要使用联合来存储指针和访问引用
  • 不要使用活接头来创建更便宜的类型铸造
另外,不要将union与可以从代码中的另一点删除的指针数据一起使用。您的联合中可能有一个已删除的指针,并且意外地使用其他定义引用了数据


最重要的是,如果你不明白这个答案不要使用联合。

联合可以作为获取数据结构的实际二进制表示形式的一种方法

#include <iostream>
#include <iomanip>

union MyUnion {
    int integer;
    unsigned char bytes[sizeof(int)];
};

int main() {
    MyUnion foo;
    foo.integer = 42;
    std::cout << "My computer represents " << foo.integer << " as:";
    for (int i = 0; i < sizeof(foo.bytes); ++i) {
      std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0')
                << static_cast<unsigned int>(foo.bytes[i]);
    }
    std::cout << std::endl;
    return 0;
}
#包括
#包括
我的联盟{
整数;
无符号字符字节[sizeof(int)];
};
int main(){
美联富;
foo.integer=42;

联合可以是获取数据结构的实际二进制表示的一种方法

#include <iostream>
#include <iomanip>

union MyUnion {
    int integer;
    unsigned char bytes[sizeof(int)];
};

int main() {
    MyUnion foo;
    foo.integer = 42;
    std::cout << "My computer represents " << foo.integer << " as:";
    for (int i = 0; i < sizeof(foo.bytes); ++i) {
      std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0')
                << static_cast<unsigned int>(foo.bytes[i]);
    }
    std::cout << std::endl;
    return 0;
}
#包括
#包括
我的联盟{
整数;
无符号字符字节[sizeof(int)];
};
int main(){
美联富;
foo.integer=42;

STD:在一次列车失事中,你从你的角度来看他们之间的区别是什么?在C++中没有一个很好的使用联盟;联合是C的遗迹,在存在的情况下是完全可忽略的。在正常的应用程序开发中,我会说永远不会*。另一方面,当你有8 MHz和1024字节的内存…*ASE不是永远不会,这些规则不是,而是一个指示,你应该决定自己是否合适。任何人加入贸易结构?在一次列车失事中,你会想到什么是它们之间的区别?从你的角度来看,没有一个好的用途,一个联盟在C++;联盟是一个遗迹的C,这是完全可忽略的。在正常的应用程序开发中,我会说从不。另一方面,当你有8 MHz和1024字节的内存时…*从不在这种情况下不是永远,这样的规则不是永远,而是你应该自己决定是否合适的指示。有人加入过交易结构吗?如果你提到unde涉及到精细的行为,我可能+1这是一个很好的答案如果我们有相同的数据,并且数据是互斥的,那么为什么我们不只使用一个变量呢?在一个联合体中,需要使用两个变量吗?至少如果我们是自己编程的,那么我们知道数据什么时候应该互斥?@AbdulSamad Part数据的个数将被共享。只有当类型定义在相互排斥的部分之间发生更改时,才需要使用两个变量进行联合。如果类型定义相同,则不需要联合。同样,这只是为了节省空间。+1表示“仅当您知道自己在做什么时”!!!我想对其余的答案再加一个+1。如果你提到未定义的行为,我可能会+1这个很好的答案如果我们有相同的数据,并且这些数据是互斥的,那么为什么我们不只使用一个变量呢?在一个联合体中使用两个变量的必要性是什么?至少如果我们是通过o编程的话那么我们知道什么时候数据应该是互斥的?@AbdulSamad部分数据将被共享。只有当互斥部分之间的类型定义发生变化时,才需要使用两个变量进行联合。如果类型定义相同,则不需要联合。同样,这只是为了节省空间。+1用于“只有当你知道你在做什么的时候”!!!我想在剩下的答案中再加一个+1。