C++ 联合体中未使用内存的内容是什么?

C++ 联合体中未使用内存的内容是什么?,c++,unions,stack-memory,C++,Unions,Stack Memory,假设我有一个工会: union foo { char a; int i; } 在一个平台上,sizeof foo.isizeof foo.a 如果我分配给foo.a,以前属于foo.I的内存的其余部分会发生什么情况?未定义您未写入的内存会发生什么情况。编译器可以选择保持其内容不变。它可能(例如出于性能原因)用任意值覆盖以前的内容 正是出于这个原因,在编写foo.a之后读取foo.i是一种未指明的行为。有趣的是,C11标准在6.2.6.1.7中对此非常清楚: 当值存储在union

假设我有一个工会:

union foo {
    char a;
    int i;
}
在一个平台上,
sizeof foo.i
sizeof foo.a


如果我分配给
foo.a
,以前属于
foo.I
的内存的其余部分会发生什么情况?

未定义您未写入的内存会发生什么情况。编译器可以选择保持其内容不变。它可能(例如出于性能原因)用任意值覆盖以前的内容


正是出于这个原因,在编写
foo.a
之后读取
foo.i
是一种未指明的行为。

有趣的是,C11标准在6.2.6.1.7中对此非常清楚:

当值存储在union类型的对象的成员中时,对象表示形式中与该成员不对应但与其他成员对应的字节采用未指定的值

不幸的是,我在C++14标准中没有发现任何清晰的内容。第9.5节:

在联合中,在任何时候最多可以有一个非静态数据成员处于活动状态,即at的值 大多数非静态数据成员可以随时存储在联合中。[注:一项特别担保 是为了简化联合体的使用:如果一个标准布局联合体包含多个标准布局联合体 共享公共初始序列(9.2)的结构,如果是此标准布局联合类型的对象 包含一个标准布局结构,允许它检查任何 标准布局结构构件;见9.2.-尾注]

奇怪的是,这项保证非常具体,我找不到任何关于布局兼容成员的保证。然而,两种不同大小的类型在布局上不兼容,不可能是共同初始序列的一部分。因此,我猜标准不允许检查非活动成员


在访问值时,未定义的行为就是这样,尽管我认为未指定的值更有意义。

这有关系吗?如果您试图使用两个不同的类型使用UNION C++中未定义的注释,则不会发生任何事情。访问它只是没有定义。实际上,它可能包含与最初相同的值,但这并不能保证。你想解决什么实际问题?@cody-说什么都没发生是不安全的。它可能被覆盖或不被覆盖;这取决于编译器。可以肯定地说,读取任何其他成员现在都是未定义的行为。这是UB,因为标准对此没有任何规定,但为什么编译器对待在联合中写入
inti
的方式不同于将写入
inti
视为局部变量或类成员(
p->i
)?这似乎绝对是标准应该涵盖的内容。@kfsone-编译器更可能以与其他地方不同的方式处理联合中对
char a
的写入-例如,在字节寻址涉及读-修改-写循环的体系结构中,如果知道写一个完整的机器字是安全的,这是可以避免的。你确定这是未定义的行为而不是未指定的或实现定义的行为吗?我的意思是写未指定的-谢谢你的更正,@zulan。