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;
_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;
_は何も出力しません。
B
がstruct
の場合、B()
はA()
を呼び出し、~B()
は~A()
を呼び出します、それを防ぐことはできません。
簡単に言えば、値を明示的に割り当て/初期化しない限り、単一メンバーの共用体は割り当てられたメモリを初期化しません。この機能はstd:: optional
c ++ 17では。