Sdílet prostřednictvím


C28652

upozornění C28652: Statický inicializátor způsobí kopírování na stránkách zápisu kvůli přetíženým bitových operátorům

Statické inicializátory globálních nebo statických proměnných const je často možné plně vyhodnotit v době kompilace, a proto je lze vygenerovat v oddílech .rdata. Pokud však jakýkoli inicializátor vyžaduje volání funkce, může být celý inicializátor vložen do stránek kopírování na zápis, které mají náklady na výkon. Tato inicializace má volání přetížených bitové operátory u typů výčtu. Pokud mají přetížené implementace zřejmé sémantiky, může použití vhodných přetypování nebo maker vytvořit stejný účinek bez nutnosti kopírování při zápisu.

příklad

Následující příklad kódu vygeneruje toto upozornění.

#include <nt.h>

typedef enum
{
    ENUM_VAL_1 = 0x1,
    ENUM_VAL_2 = 0x2,
    ENUM_VAL_3 = 0x4
} ENUM_VALS;

DEFINE_ENUM_FLAG_OPERATORS(ENUM_VALS);

const ENUM_VALS rgValsRuntime[] = {
    ENUM_VAL_1 | ENUM_VAL_2,    // Runtime init!
    ENUM_VAL_3                  // Compile time init
};  

Následující příklad kódu zabrání tomuto upozornění.

#include <nt.h>

typedef enum
{
    ENUM_VAL_1 = 0x1,
    ENUM_VAL_2 = 0x2,
    ENUM_VAL_3 = 0x4
} ENUM_VALS;

DEFINE_ENUM_FLAG_OPERATORS(ENUM_VALS);

const ENUM_VALS rgValsRuntime[] = {
    (ENUM_VALS) COMPILETIME_OR_2FLAGS(ENUM_VAL_1, ENUM_VAL_2),
    ENUM_VAL_3                  // Compile time init
};