Quand je lisais code source seastar , j'ai remarqué qu'il existe une structure d'union appelée tx_side
qui ne compte qu'un seul membre. Est-ce un hack pour résoudre un certain problème?
Pour info, je colle le tx_side
structure ci-dessous:
union tx_side {
tx_side() {}
~tx_side() {}
void init() { new (&a) aa; }
struct aa {
std::deque<work_item*> pending_fifo;
} a;
} _tx;
Parce que tx_side
Est une union, tx_side()
n'initialise/construit pas automatiquement a
et ~tx_side()
ne la détruit pas automatiquement. Cela permet un contrôle précis sur la durée de vie de a
et pending_fifo
, Via des appels de destructeur nouveaux et manuels (le std::optional
D'un pauvre).
Voici un exemple:
#include <iostream>
struct A
{
A() {std::cout << "A()\n";}
~A() {std::cout << "~A()\n";}
};
union B
{
A a;
B() {}
~B() {}
};
int main()
{
B b;
}
Ici, B b;
N'imprime rien, car a
n'est ni construit ni détruit.
Si B
était un struct
, B()
appellerait A()
et ~B()
appellerait ~A()
et vous ne pourrez pas empêcher cela.
En termes simples, sauf si explicitement assigné/initialisé une valeur, le nion à membre unique n'initialise pas la mémoire allouée. Cette fonctionnalité peut être obtenue avec std:: optional
en c ++ 17.