Java 联合与结构有何不同?其他语言有类似的结构吗?
可能重复:Java 联合与结构有何不同?其他语言有类似的结构吗?,java,c++,python,c,programming-languages,Java,C++,Python,C,Programming Languages,可能重复: 我在C中看到工会的代码: union time { long simpleDate; double perciseDate; } mytime; C中的并集和结构有什么区别?你会在哪里使用工会,它的好处是什么?在爪哇、C++和/或Python中是否有类似的构造?< P>一个联盟的行为,好像它的所有成员都在内存中的同一个位置,重叠。 当您想要表示某种类型的“通用”值或可以是一组类型中任何一种类型的值时,这非常有用。由于字段重叠,只有在
我在C中看到工会的代码:
union time
{
long simpleDate;
double perciseDate;
} mytime;
C中的并集和结构有什么区别?你会在哪里使用工会,它的好处是什么?在爪哇、C++和/或Python中是否有类似的构造?< P>一个联盟的行为,好像它的所有成员都在内存中的同一个位置,重叠。 当您想要表示某种类型的“通用”值或可以是一组类型中任何一种类型的值时,这非常有用。由于字段重叠,只有在知道字段之前已初始化的情况下,才能合法访问该字段。尽管如此,由于C不检查这一点,并且许多编译器发出允许它的代码,这是一个常见的技巧。。。有趣的类型转换,例如:
union {
int integer;
float real;
} convert;
convert.real = 3.14;
printf("The float %f interpreted as an integer is %08x", convert.real, convert.integer);
对于更完善的用法,您可以跟踪上次存储在联合中的内容,例如,它可以如下所示:
typedef enum { INTEGER = 0, REAL, BOOLEAN, STRING } ValueType;
typedef struct {
ValueType type;
union {
int integer;
float real;
char boolean;
char *string;
} x;
} Value;
void value_set_integer(Value *value, int x)
{
value->type = INTEGER;
value->x.integer = x;
}
这里,请注意联合实际上是周围结构中的一个字段,Value
。访问权限可能如下所示:
typedef enum { INTEGER = 0, REAL, BOOLEAN, STRING } ValueType;
typedef struct {
ValueType type;
union {
int integer;
float real;
char boolean;
char *string;
} x;
} Value;
void value_set_integer(Value *value, int x)
{
value->type = INTEGER;
value->x.integer = x;
}
这将记录联合的当前内容是一个整数,并存储给定的值。例如打印值
的功能可以检查类型
成员,并执行正确的操作:
void value_print(const Value *value)
{
switch(value->type)
{
case INTEGER:
printf("%d\n", value->x.integer);
break;
case REAL:
printf("%g\n", value->x.real);
break;
/* ... and so on ... */
}
}
Java中没有等价物。C++几乎是C的一个超级集合,具有相同的功能。它甚至支持“一个ups”C的实现,并允许。在C++中,上面可以写下而不命名内部联合(<代码> x>代码>),这会使代码大大缩短。在例子中, 所以,当我分配时间:
int main()
{
time t;
}
编译器可以将内存at&t解释为长:
t.simpleDate;
或者好像它是双重的:
t.perciseDate;
所以如果t处内存的原始十六进制看起来像
0x12345678;
该值可以被“解析”为double或long,具体取决于其访问方式。因此,为了使其有用,您必须知道long和double在内存中的打包和格式化时间。例如,一个long将是一个2-s的补码有符号整数,您可以阅读。您可以学习如何在二进制中格式化double 然而,结构只是将具有不同地址间隔的独立变量分组到一个内存块中 (注意,您的示例可能很危险,因为sizeof(long)可能是32位,而sizeof(double)始终是64位) 当需要“原始”表示(如字符数组)和“消息”表示时,通常使用联合。例如,通过套接字发送的消息:
struct Msg
{
int msgType;
double Val1;
double Val2;
}; // assuming packing on 32-bit boundary
union
{
Msg msg;
unsigned char msgAsBinary[20];
};
希望能有所帮助。一个联合可以用来存储它的任何一个成员,但(与结构不同)不能同时存储多个成员。您可以将其视为包含足够的空间来存储其最大的成员,并将相同的存储空间重新用于实际为其赋值的任何成员
C++也有联合体。Java没有。Python中的对象成员的工作方式与C完全不同,它们存储在字典中,而不是在内存中连续排列。我不知道Python是否有一些方便的类库,它们的作用有点像并集,但它并不像C中那样是对象的基础。对于结构,每个数据项都有自己的内存位置,但是对于并集,一次只使用一个项,为每个项分配的内存在共享内存中。联合的数据项只共享一个内存位置。联合体的大小将是最大变量的大小
这可能是有益的,因为有时我们可能不需要复杂数据结构中所有(相关)数据项的数据,并且一次只存储/访问一个数据项。Union在这种情况下很有帮助。Union允许您以几种不同的方式解释一个内存位置(原始、二进制值) 我实际使用的一个示例是访问uint32的单个字节
union {
uint32 int;
char bytes[4];
} uint_bytes;
联盟提供的是访问同一内存(部分)的多种方式
联合类型的大小等于联合中最大类型的大小。联合是一种节省空间的存储多种不同类型之一的方法。它不提供重新发现存储在其中的类型的机制;这一点必须在不一致的情况下确定。从技术上讲,访问联合中的“错误”类型(即未初始化的类型)会导致未定义的行为;在实践中,它通常会产生一个位级别的强制转换,并且经常被用作这样做的一种方式
而“联合”类型是C++(C++是C的超集),大多数C++类型都不能安全地存储在一个(具体地说,一个联合只能保存,即默认拷贝构造函数类,默认析构函数,没有虚方法)。如果你想要一个节省空间的,基于堆栈的,相当于C++中的一个联合,能够存储复杂的对象,尝试。 在其他不太关心堆栈分配的语言中,多态性完成了联合的工作。在Java中,一切都继承自一个对象,因此Object*可以用来表示任何对象;或者可以使用公共超类或接口将对象集限制为支持特定操作集的对象
在Python中,任何变量都可以包含任何对象,因此在某种意义上,所有变量都是并集。通常不需要确定存储在变量中的类型;相反,使用--也就是说,查找它支持的方法,而不是它实现的类型/接口。一次只能使用联合的一个成员,而不是所有成员一起驻留在内存中的结构。因为联合空间是按它所包含的最长元素的大小分配的。dupe:从技术上讲,不是dupe,因为问题的第二部分是关于其他语言的重叠有问题吗?重叠的问题是你不知道最后写了什么。除了一些孤立的情况外,它们在所有情况下都是危险的,但它们非常危险