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