C++ Union妙用(将列表初始化用于数组元素)

Union是个不被注意的关键字,意为联合体,这是个诡异的名字。若不是为了继承C语言,它也不会出现在C++中(虽说,union在C++中得到了扩充,完成了接近类的功能)。它的作用主要是节省内存空间,在嵌入式编程中有用。但在为当代微机设计的C++中,它也并非一无是处。请看看下面的代码:

class A
{
private:
int a[];
public:
A(int n):a[](n){}
};//Wrong code

你以为这代码能通过编译?是的,按道理来讲应该这样,因为逻辑上没有任何错误。但是运行一下编译器,你会得到如下错误expected '(' before '[' token:A(int n):a[0](n){}。额…貌似数组元素不能用于列表初始化。这时候,可以将a[0]的初始化放入函数体内,但这样会有一些弊端:有强迫症的程序员会受不了,运行速度也会满一点点。我们可以用union巧妙解决。

class A
{
private:
union {
int a[];
int a0;
};
public:
A(int n):a0(n){}
};

原理不难理解,按照union的机制,a0与a[0]其实是共用一个int的,也就是说a0和a[0]的地址相同,对a0的初始化也是对a[0]的初始化。这样可以绕过C++的那个诡异的语法判断(虽说这不是Union的初衷)。

上一篇:Linux kernel Vhost-net 和 Virtio-net代码详解


下一篇:Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback