Partager via


C28652

avertissement C28652 : L’initialiseur statique provoque la copie sur les pages d’écriture en raison d’opérateurs surchargés au niveau du bit

Les initialiseurs statiques de variables const globales ou statiques peuvent souvent être entièrement évalués au moment de la compilation et peuvent donc être générés dans des sections .rdata. Toutefois, si un initialiseur nécessite un appel de fonction, l’initialiseur entier peut être placé dans des pages de copie sur écriture, ce qui a un coût de performances. Cette initialisation a des appels aux opérateurs surchargés au niveau du bit sur les types enum. Si les implémentations surchargées ont la sémantique évidente, l’utilisation de casts ou de macros appropriées peut produire le même effet sans nécessiter de copie en écriture.

Exemple

L’exemple de code suivant génère cet avertissement.

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

L’exemple de code suivant évite cet avertissement.

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