Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
};