C++ 分配给会员工会

C++ 分配给会员工会,c++,unions,C++,Unions,假设我有一个班,班上有工会成员: class ClassX { public: union { StructA * A; StructB * B; }; } 如果我有指向不同ClassX对象的指针x1和x2,是否: x1->A = x2->A; 具有与此相同的效果: x1->B = x2->B; ??谢谢。除非StructA和StructB的大小相同,否则它们不会有相同的效果。您发布的第一行将x2->A占用的所有内存复制到x1->A,

假设我有一个班,班上有工会成员:

class ClassX {
public:
  union {
    StructA * A;
    StructB * B;
    };
  }
如果我有指向不同ClassX对象的指针x1和x2,是否:

x1->A = x2->A;
具有与此相同的效果:

x1->B = x2->B;

??谢谢。

除非StructA和StructB的大小相同,否则它们不会有相同的效果。您发布的第一行将
x2->A
占用的所有内存复制到
x1->A
,而第二行对
B
执行相同的操作
A
B
占用内存的重叠区域,但它们的大小可能不同,在这种情况下,这两个语句并不相等。

除非StructA和StructB具有相同的大小,否则它们的效果并不相同。您发布的第一行将
x2->A
占用的所有内存复制到
x1->A
,而第二行对
B
执行相同的操作
A
B
占用内存的重叠区域,但它们的大小可能不同,在这种情况下,这两个语句并不相等。

操作应该相同。但是,如果您为这两种指针类型中的任何一种重载赋值运算符,则情况可能并非如此。

操作应该相同。但是,如果您为这两种指针类型中的任何一种重载赋值运算符,则情况可能并非如此。

对于大多数实际目的,在大多数实现中,这两个语句将具有相同的效果,但不能保证。如果从联合中读取的成员不是写入该联合的最后一个成员,则程序的行为未定义


由于联合体的两个成员都是指向结构的指针,因此它们很可能占用相同的大小并具有类似的表示形式,因此,如果源联合体中实际存储的是另一个联合体成员,则分配任何一个联合体成员都可能正确地分配另一个联合体成员。

在大多数实现中,出于最实际的目的,这两种说法会有同样的效果,但不能保证。如果从联合中读取的成员不是写入该联合的最后一个成员,则程序的行为未定义


由于联合体的两个成员都是指向结构的指针,因此它们很可能占用相同的大小并具有类似的表示形式,因此,如果源联合体中实际存储的是一个联合体成员,则分配其中一个联合体成员可能会正确分配另一个联合体成员。

您希望得到什么样的答案

一个正式而迂腐的人?如果是这样,那么这个问题就没有答案了。C++语言确实给你提供了比较这两个任务效果的正式机会。如果分配了
ClassX::A
,则只能读取
ClassX::A
,而不能读取
ClassX::B
。如果分配了
ClassX::B
,则只能读取
ClassX::B
,而不能读取
ClassX::A
。换句话说,没有任何有意义的理由去关心效果是否相同。语言根本不允许你关心它。如果你的代码不知何故依赖它,那么它的行为是不确定的,就正式C++而言。
至于这个问题的现实答案。。。是的,在任何合理的语言实现中,效果应该是相同的。

您希望得到什么样的答案

一个正式而迂腐的人?如果是这样,那么这个问题就没有答案了。C++语言确实给你提供了比较这两个任务效果的正式机会。如果分配了
ClassX::A
,则只能读取
ClassX::A
,而不能读取
ClassX::B
。如果分配了
ClassX::B
,则只能读取
ClassX::B
,而不能读取
ClassX::A
。换句话说,没有任何有意义的理由去关心效果是否相同。语言根本不允许你关心它。如果你的代码不知何故依赖它,那么它的行为是不确定的,就正式C++而言。 至于这个问题的现实答案。。。是的,在任何合理的语言实现中,效果应该是相同的。

在联合体中,最多一个数据 成员可以随时处于活动状态, 也就是说,值最多为 数据成员可以存储在 任何时候都可以结婚。[注:一项特别建议] 作出保证是为了简化程序 联合体的使用:如果是POD联合体 包含多个POD结构,这些结构 共享一个共同的初始序列 (class.mem),如果 POD联合类型包含一个 POD结构,允许 检查以下各项的共同初始顺序: 任何POD结构成员;请参阅 class.mem。]

一定要注意特殊保证。

在联合体中,最多一个数据 成员可以随时处于活动状态, 也就是说,值最多为 数据成员可以存储在 任何时候都可以结婚。[注:一项特别建议] 作出保证是为了简化程序 联合体的使用:如果是POD联合体 包含多个POD结构,这些结构 共享一个共同的初始序列 (class.mem),如果 POD联合类型包含一个 POD结构,允许 检查以下各项的共同初始顺序: 任何POD结构成员;请参阅 class.mem。]


一定要注意特殊保证。

这是我们所期望的。联合意味着A和B在记忆中占据相同的位置。这是人们所期望的。并集意味着A和B在内存中占据相同的位置。这些是被复制的结构指针,而不是结构。非常确定,不管底层结构的内容如何,它们都是相同的大小。x2->A是指针。除非指针有不同的大小或对齐要求,否则它可能会工作。实现很少对不同的结构使用不同的指针表示。这些是被复制的结构指针,而不是结构。很确定这些都是同样大小的雷加