1. ホーム
  2. c++

[解決済み] 組合員が1人しかいない組合を使う目的は何ですか?

2023-02-07 20:51:55

質問

私が シースターのソースコード というユニオン構造体があることに気づきました。 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() は自動的に初期化/構築されません。 a~tx_side() は自動的に破壊されません。 これによって apending_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() を呼び出すことになり、それを防ぐことはできません。