Share via


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