Delen via


C28652

waarschuwing C28652: Statische initialisatie zorgt voor kopiëren op schrijfpagina's vanwege overbelaste bitsgewijze operators

Statische initialisaties van globale of statische const-variabelen kunnen vaak volledig worden geëvalueerd tijdens het compileren en kunnen dus worden gegenereerd in .rdata-secties. Als voor een initialisatiefunctie echter een functieoproep is vereist, kan de volledige initialisatie worden geplaatst in kopieer-op-schrijfpagina's, met een prestatiekosten. Deze initialisatie bevat aanroepen naar overbelaste bitsgewijze operators voor enumtypen. Als de overbelaste implementaties de voor de hand liggende semantiek hebben, kan het gebruik van geschikte casts of macro's hetzelfde effect opleveren zonder dat er copy-on-write nodig is.

voorbeeld

In het volgende codevoorbeeld wordt deze waarschuwing gegenereerd.

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

In het volgende codevoorbeeld wordt deze waarschuwing voorkomen.

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