Jaký je nejlepší způsob, jak inicializovat bitfield struct v C ++?

hlasů
4

V jazyce C ++, Mám třídu, která obsahuje anonymní bitové pole Struct. Chci ji inicializovat na nulu, aniž by museli ručně vypsat všechna pole.

Dovedu si představit uvedení inicializaci na třech místech:

  1. Vytvořte konstruktor v bitfield
  2. Nula v seznamu Inicializátor konstruktoru pro třídu obsahující
  3. Nula se v těle konstruktoru pro třídu obsahující

Tento bitfield má mnoho polí, a raději bych je všechny vypsat.

Například viz následující kód:

class Big {
    public:
        Big();

        // Bitfield struct
        struct bflag_struct {
            unsigned int field1 : 1;
            unsigned int field2 : 2;
            unsigned int field3 : 1;
            // ...
            unsigned int field20 : 1;
            // bflag_struct(); <--- Here?
        } bflag;

        unsigned int integer_member;
        Big         *pointer_member;
}

Big::Big()
  : bflag(),             // <--- Can I zero bflag here?
    integer_member(0),
    pointer_member(NULL)
{
    // Or here?
}

Jedním z nich je lepší? Nebo je ještě něco mi chybí?

Edit: na přijaté odpovědi níže (Ferruccio) jsem se usadil na tomto řešení na bázi:

class Big {
    // ...

    struct bflag_struct {
        unsigned int field 1 : 1;
        // ...
        bflag_struct() { memset(this, 0, sizeof *this); };
    }

    // ...
}
Položena 04/03/2009 v 21:51
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
9

Dalo by se vždy to dělat ve svém konstruktoru:

memset(&bflag, 0, sizeof bflag);
Odpovězeno 04/03/2009 v 21:54
zdroj uživatelem

hlasů
0

jste mohli nula paměti pomocí ZeroMemory nebo memset v konstruktoru, že způsob, jak to vypadalo to čistší.

Odpovězeno 04/03/2009 v 21:55
zdroj uživatelem

hlasů
6

Dalo by se použít unii, i když to bude přidávat další úrovně dereference při přístupu polí:

class Big {
    union {
        struct {
            unsigned int field1 : 1;
            ...
        } fields;
        unsigned int all_fields;
    };
    ...
};

Big::Big()
  : all_fields(0),
    ...
{
    ...
}

MSVC umožňuje anonymní structs uvnitř odborů (viz například definice D3DMATRIXv <d3d9.h>), ale jedná se o rozšíření nestandardní C ++, které byste se měli vyhnout použití, pokud je to možné.

Odpovězeno 04/03/2009 v 21:56
zdroj uživatelem

hlasů
9

Unie do bitfield struct něco snazší inicializaci na 0 ° C.

Odpovězeno 04/03/2009 v 21:56
zdroj uživatelem

hlasů
3

Mimochodem, pokud budete potřebovat bitové pole na rozhraní k nějaké starší kód, byste neměli používat. Jsou jsou ze své podstaty nepřenositelné a neefektivní.

Odpovězeno 04/03/2009 v 21:57
zdroj uživatelem

hlasů
2

Vaše použití funkce podobné inicializátor (označené „Mohu nula bflag tady?“) Je 100% stačí k inicializaci POD struct s 0 hodnotami.

Pokud víte, že vaše překladač je rozdělena v tomto ohledu dělat žádné další inicializace těchto členů je inicializace dvakrát žádný přínos.

EDIT: Jen pro 'fun' Jen jsem zkontrolovat to s VS2005, VS2008, GCC 3.4.4, GCC 4.2 a Borland C ++ 5.5.1 ... Pouze Borland C ++ 5.5.1 dostane to špatně.

A já říkám, ‚špatný‘, protože se mi zdá, že 8.5 a 8.5.1 normy vyplývá, že funkce tvaru Inicializátor měla nulové init lusku struct.

Odpovězeno 05/03/2009 v 16:43
zdroj uživatelem

hlasů
0

BTW C ++ 20 podporuje inicializaci bitfields v definici třídy, např

class ... {
   int foo : 1 {};
}

gcc s -std = C ++ 2a umožnit

Odpovězeno 01/09/2019 v 01:03
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more