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

当我阅读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;
ayangyy 回答:只使用一个成员的联合的目的是什么?

由于tx_side是一个联合,tx_side()不会自动初始化/构造a,并且~tx_side()也不会自动破坏它。  这样可以通过重新放置新的和手动的析构函数调用(穷人的a)对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既未构造也未破坏。

如果Bstruct,则B()将呼叫A(),而~B()将呼叫~A(),而您不会能够防止这种情况。

,

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

本文链接:https://www.f2er.com/3022968.html

大家都在问