C28652

avviso C28652: l'inizializzatore statico causa la copia nelle pagine di scrittura a causa di operatori bit per bit di overload

Gli inizializzatori statici di variabili const globali o statiche spesso possono essere valutati completamente in fase di compilazione e pertanto possono essere generati nelle sezioni .rdata. Tuttavia, se un inizializzatore richiede una chiamata di funzione, l'intero inizializzatore può essere inserito in pagine di copia in scrittura, con un costo delle prestazioni. Questa inizializzazione include chiamate agli operatori bit per bit di overload sui tipi enum. Se le implementazioni di overload hanno la semantica ovvia, l'uso di cast o macro appropriati può produrre lo stesso effetto senza richiedere la copia su scrittura.

Esempio

L'esempio di codice seguente genera questo avviso.

#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
};  

Nell'esempio di codice seguente viene evitato questo avviso.

#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
};