Поделиться через


C28652

предупреждение C28652: статический инициализатор вызывает копирование на страницах записи из-за перегруженных битовых операторов

Статические инициализаторы глобальных или статических переменных const часто могут быть полностью оценены во время компиляции и, таким образом, могут создаваться в разделах RDATA. Однако если какой-либо инициализатор требует вызова функции, весь инициализатор может быть помещен в страницы копирования при записи, что имеет затраты на производительность. Эта инициализация вызывает перегруженные битовые операторы для типов перечисления. Если перегруженные реализации имеют очевидную семантику, использование соответствующих приведения или макросов может дать тот же эффект без необходимости копирования при записи.

Примере

Это предупреждение создается в следующем примере кода.

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

Следующий пример кода позволяет избежать этого предупреждения.

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