C28652
aviso C28652: inicializador estático causa cópia em páginas de gravação devido a operadores bit a bit sobrecarregados
Inicializadores estáticos de variáveis const globais ou estáticas geralmente podem ser totalmente avaliados em tempo de compilação e, portanto, podem ser gerados em seções .rdata. No entanto, se qualquer inicializador exigir uma chamada de função, todo o inicializador poderá ser colocado em páginas de cópia na gravação, o que tem um custo de desempenho. Essa inicialização tem chamadas para operadores bit a bit sobrecarregados em tipos de enumeração. Se as implementações sobrecarregadas tiverem a semântica óbvia, o uso de conversões ou macros apropriadas poderá produzir o mesmo efeito sem a necessidade de cópia na gravação.
Exemplo
O exemplo de código a seguir gera esse aviso.
#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
};
O exemplo de código a seguir evita esse aviso.
#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
};