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