web-dev-qa-db-fra.com

Quel est le but d'utiliser un syndicat avec un seul membre?

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;
88
daoliker

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.

82
HolyBlackCat

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.

0
Sitesh