Share via


C28652

advertencia C28652: el inicializador estático provoca la copia en páginas de escritura debido a operadores bit a bit sobrecargados

Los inicializadores estáticos de variables const globales o estáticas a menudo se pueden evaluar completamente en tiempo de compilación y, por tanto, se pueden generar en secciones .rdata. Sin embargo, si algún inicializador requiere una llamada de función, todo el inicializador puede colocarse en páginas de copia en escritura, lo que tiene un costo de rendimiento. Esta inicialización tiene llamadas a operadores bit a bit sobrecargados en tipos de enumeración. Si las implementaciones sobrecargadas tienen la semántica obvia, el uso de conversiones o macros adecuadas puede producir el mismo efecto sin necesidad de copiar en escritura.

Ejemplo

El ejemplo de código siguiente genera esta advertencia.

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

En el ejemplo de código siguiente se evita esta advertencia.

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