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