使用只有一个成员的联合的目的是什么?

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)对 apending_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 既未构造也未析构。

如果 BstructB() 会调用 A(),而 ~B() 会调用 ~A(),你不会'无法阻止。

简单来说,除非明确assigned/initialized一个值,否则单一成员联合体不会初始化分配的内存。这个功能可以用 c++17 中的 std:: optional 来实现。