Freigeben über


C28652

Warnung C28652: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund überladener bitweiser Operatoren kopiert wird.

Statische Initialisierer globaler oder statischer Konstvariablen können häufig zur Kompilierungszeit vollständig ausgewertet werden und können daher in RDATA-Abschnitten generiert werden. Wenn jedoch ein Initialisierer einen Funktionsaufruf erfordert, kann der gesamte Initialisierungsvorgang in Kopier-on-Write-Seiten platziert werden, die leistungseinbußen haben. Diese Initialisierung hat Aufrufe an überladene Bitweise-Operatoren für Enumerationstypen. Wenn die überladenen Implementierungen über die offensichtliche Semantik verfügen, kann die Verwendung entsprechender Umwandlungen oder Makros denselben Effekt erzeugen, ohne dass kopier-on-write erforderlich ist.

Beispiel

Im folgenden Codebeispiel wird diese Warnung generiert.

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

Im folgenden Codebeispiel wird diese Warnung vermieden.

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