Freigeben über


C28652

Warnung C28652: Statische Initialisierung verursacht das Kopieren auf Schreibseiten aufgrund überladener bitweiser Operatoren

Statische Initialisierer globaler oder statischer Constvariablen können häufig zur Kompilierzeit vollständig ausgewertet und daher in RDATA-Abschnitten generiert werden. Wenn jedoch ein Initialisierer einen Funktionsaufruf erfordert, kann der gesamte Initialisierer in Kopiervorgängen eingefügt werden, was zu Leistungskosten führen kann. Diese Initialisierung enthält Aufrufe von überladenen bitweisen Operatoren für Enumerationstypen. Wenn die überladenen Implementierungen über die offensichtliche Semantik verfügen, kann die Verwendung entsprechender Casts oder Makros denselben Effekt erzeugen, ohne dass das Kopieren beim Schreiben 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
};