我之前总是觉得,10 万行 C++ 代码里,用到一个 union 就不错了(可能比较夸张)。但是现在我突然想到,在一类情况下,union 还是大有用武之地的。

有的时候我们需要直接对二进制数据进行操作,比如将一个结构体的信息保存到一个二进制文件里的时候,或者直接操作一些底层的东西,或者说开发一些底层的协议啥的。在之前我都是用“把结构体指针转换成 char 数组指针”,然后进行的。

比如这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
struct param_type {
    unsigned int size;
    /* ... */
};
void func() {
    param_type param;
    param.size = sizeof(param);
    /* ... */
    unsigned char *ptr = (unsigned char *)&param;
    /* ... */
}

这里就是把 struct 指针转换成 char 指针,然后把它当数组操作。

其实类似的功能可以用 union 实现,而且实现得还挺方便,逻辑也清晰一些。可能 union 用得比较少,所以到了真正要用的时候,我们却忘记了……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct param_type {
    unsigned int size;
    /* ... */
};
union param_union {
    param_type param;
    unsigned char binary[sizeof(param)];
};
void func() {
    param_union pu;
    pu.param.size = sizeof(pu);
    /* ... */
    // Operations with pu.binary, instead of ptr.
    /* ... */
}

是不是感觉更方便了?

原创文章,转载请注明来源:http://euyuil.com/3023/union-in-cplusplus/