使用只有一个成员的联合的目的是什么?
What's the purpose of using a union with only one member?
当我阅读 seastar source code 时,我注意到有一个名为 tx_side
的联合结构,它只有一个成员。这是解决某个问题的技巧吗?
仅供参考,我在下面粘贴 tx_side
结构:
union tx_side {
tx_side() {}
~tx_side() {}
void init() { new (&a) aa; }
struct aa {
std::deque<work_item*> pending_fifo;
} a;
} _tx;
因为 tx_side
是联合,tx_side()
不会自动 initialize/construct a
,并且 ~tx_side()
不会自动破坏它。
这允许通过 placement-new 和手动析构函数调用(穷人的 std::optional
)对 a
和 pending_fifo
的生命周期进行细粒度控制。
这是一个例子:
#include <iostream>
struct A
{
A() {std::cout << "A()\n";}
~A() {std::cout << "~A()\n";}
};
union B
{
A a;
B() {}
~B() {}
};
int main()
{
B b;
}
此处,B b;
不打印任何内容,因为 a
既未构造也未析构。
如果 B
是 struct
,B()
会调用 A()
,而 ~B()
会调用 ~A()
,你不会'无法阻止。
简单来说,除非明确assigned/initialized一个值,否则单一成员联合体不会初始化分配的内存。这个功能可以用 c++17 中的 std:: optional
来实现。
当我阅读 seastar source code 时,我注意到有一个名为 tx_side
的联合结构,它只有一个成员。这是解决某个问题的技巧吗?
仅供参考,我在下面粘贴 tx_side
结构:
union tx_side {
tx_side() {}
~tx_side() {}
void init() { new (&a) aa; }
struct aa {
std::deque<work_item*> pending_fifo;
} a;
} _tx;
因为 tx_side
是联合,tx_side()
不会自动 initialize/construct a
,并且 ~tx_side()
不会自动破坏它。
这允许通过 placement-new 和手动析构函数调用(穷人的 std::optional
)对 a
和 pending_fifo
的生命周期进行细粒度控制。
这是一个例子:
#include <iostream>
struct A
{
A() {std::cout << "A()\n";}
~A() {std::cout << "~A()\n";}
};
union B
{
A a;
B() {}
~B() {}
};
int main()
{
B b;
}
此处,B b;
不打印任何内容,因为 a
既未构造也未析构。
如果 B
是 struct
,B()
会调用 A()
,而 ~B()
会调用 ~A()
,你不会'无法阻止。
简单来说,除非明确assigned/initialized一个值,否则单一成员联合体不会初始化分配的内存。这个功能可以用 c++17 中的 std:: optional
来实现。