Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 nelle pagine copy-on-write, con un costo di prestazioni. Questa inizializzazione include chiamate agli operatori bit per bit di overload sui tipi enumerazione. 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 di
Nell'esempio di codice seguente viene generato 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
};