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


C28652

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

Статические инициализаторы глобальных или статических переменных константа часто могут быть полностью оценены во время компиляции, поэтому их можно создать в разделах 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
};