首页 > 解决方案 > 使用只有一个成员的工会的目的是什么?

问题描述

在阅读seastar 源代码时,我注意到有一个名为 union 的结构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;

标签: c++c++14unions

解决方案


因为tx_side是一个联合,tx_side()不会自动初始化/构造a~tx_side()也不会自动破坏它。这允许通过放置新和手动析构函数调用(穷人的)对aand的生命周期进行细粒度控制。pending_fifostd::optional

这是一个例子:

#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是 a structB()将会调用A(),并且~B()会调用~A(),并且您将无法阻止这种情况。


推荐阅读