联合体统一初始化与静态初始化规则咨询(无构造函数场景)
联合体的初始化规则(无自定义构造函数时)
当联合体没有自定义构造函数时,它属于聚合类型,用大括号{}做初始化时遵循以下简单规则:
- 如果你只给一个初始化值,这个值会被用来初始化联合体的第一个命名成员。
- 联合体的其他成员不会被单独初始化,但因为所有成员共享同一块内存,其他成员的内存内容会和被初始化的第一个成员重叠。
拿你的代码举例:
union U { struct { int i, j; } s; // 这是联合体的第一个成员 long long x, y; int z; }; U li { 1 };
这里{1}会初始化第一个成员s——具体是把s.i设为1,s.j会被自动初始化为0(聚合初始化里没指定的成员会被值初始化)。而x和s共享同一块内存,在小端系统(比如常见的x86架构)下,x的低4字节对应s.i(值为1),高4字节对应s.j(值为0),所以x的整体数值就是1,这就是你反汇编看到的结果。
你提到的Win32里的LARGE_INTEGER,它的定义里第一个成员就是QuadPart(64位的long long类型),所以用LARGE_INTEGER li = {1};时,直接就把QuadPart初始化为1,刚好契合常用场景,所以用起来特别便捷。
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

