【发布时间】:2021-06-09 13:04:11
【问题描述】:
union test{
char a; // 1 byte
int b; // 4 bytes
};
int main(){
test t;
t.a = 5;
return t.b;
}
这个链接说:https://en.cppreference.com/w/cpp/language/union
从最近未写入的联合成员中读取是未定义的行为。
据此,我上面的示例代码有UB吗? 如果是这样,那么联盟的意义何在?我认为重点是读/写 不同的值类型形成相同的内存位置。
如果我需要访问 most recently written 值,那么我将只使用
常规变量而不是联合。
【问题讨论】:
-
工会的最初动机是在您一次只需要一个成员时节省内存 afaik。那是在你没有大量记忆的过去。
-
联合的真实用例:我们有一个 API 允许查询许多不同的参数。这些参数可以有不同的类型(包括类)。因此,我们返回一个包装结构,其中包含一个表示活动成员的枚举和一个可能的参数类型的联合,并填充了正确的数据。
-
如果是这样,那么工会的意义何在? 使用工会并不意味着需要阅读其不活跃的成员。例如,请参阅 libstdc++ 中
std::basic_string的实现,其中短字符串的缓冲区使用容量成员变量进行别名。由于您可以通过将数据指针与此缓冲区的地址进行比较来检测短/长字符串,因此无需访问非活动成员并且联合仍然有用。代码:github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/…. -
这能回答你的问题吗? Unions and type-punning
-
@463035818_is_not_a_number 这绝对不只是一些old-days-issue。联合仍在使用,例如,在所有主流库(libstdc++、libc++、Microsoft STL)中实现字符串类。您不希望字符串对象过大,因为内存中可能会同时存在很多对象。
标签: c++