web-dev-qa-db-ja.com

メンバーが1つだけの組合を使用する目的は何ですか?

seastarソースコード を読んでいたときに、tx_sideというユニオン構造があり、メンバーが1つしかないことに気付きました。これは特定の問題に対処するためのハックですか?

参考までに、以下のtx_side構造を貼り付けます。

union tx_side {
    tx_side() {}
    ~tx_side() {}
    void init() { new (&a) aa; }
    struct aa {
        std::deque<work_item*> pending_fifo;
    } a;
} _tx;
88
daoliker

_tx_side_は共用体であるため、tx_side()aを自動的に初期化/構築せず、~tx_side()はそれを自動的に破棄しません。これにより、プレースメントの新規および手動のデストラクタ呼び出し(貧しい人の_pending_fifo_)を介して、aおよび_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;
}
_

ここで、aは構築も破壊もされていないため、_B b;_は何も出力しません。

Bstructの場合、B()A()を呼び出し、~B()~A()を呼び出します、それを防ぐことはできません。

82
HolyBlackCat

簡単に言えば、値を明示的に割り当て/初期化しない限り、単一メンバーの共用体は割り当てられたメモリを初期化しません。この機能はstd:: optional c ++ 17では。

0
Sitesh