c++ - 使用只有一名成员的 union 的目的是什么?

标签 c++ c++14 unions

当我阅读seastar source code时,我注意到有一个名为 tx_side 的 union 结构,它只有一个成员。这是处理某个问题的一些技巧吗?

仅供引用,我将 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()不会自动初始化/构造a ,和~tx_side()不会自动破坏它。 这允许对 a 的生命周期进行细粒度控制。和pending_fifo ,通过 Placement-new 和手动析构函数调用(穷人的 std::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既不被构造也不被破坏。

如果Bstruct , B()会打电话 A() ,和~B()会打电话 ~A() ,并且您无法阻止这种情况。

关于c++ - 使用只有一名成员的 union 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59066929/

相关文章:

c++ - 如何在发出 commandFinished() 信号时检查状态

c++在包含多键时 boost 解析ini文件

c++ - 如何将线程与容器 C++ 一起使用

c++ - std::atomic 平凡可复制结构

c++ - 谢尔宾斯基三角形的周长

c++ - C++ 中的 union 和按位运算

C++ 分词器分隔符不编译

c++ - 如何返回 lambda 对象?

c++ - 如何静态初始化包含 union 的结构数组?

union 体可以在声明中初始化吗?