/Zc: sizedDealloc (グローバル サイズ割り当て解除関数の有効化)
/Zc:sizedDealloc コンパイラ オプションを指定すると、オブジェクトのサイズが有効なときに、2 番目のパラメーターの型が size_t
のグローバル operator delete
または operator delete[]
関数を優先的に呼び出すようコンパイラに指示が出されます。 デアロケーターのパフォーマンスを最適化するために、これらの関数で size_t
パラメーターが使用されることがあります。
構文
/Zc:sizedDealloc[-]
解説
C++ 11 標準では、2 番目の size_t
パラメーターを取る、静的メンバー関数 operator delete
と operator delete[]
を定義できます。 通常、これらはそのオブジェクトのより効率的なアロケーターとデアロケーターを実装するために、operator new 関数と組み合わせて使用されます。 ただし、C++ 11 には、グローバル スコープで同じ割り当て解除関数のセットが定義されていませんでした。 C++ 11 では、2 番目のパラメーターの型が size_t
のグローバルな割り当て解除関数を、配置削除関数と見なします。 それらは、サイズ引数を渡すことによって明示的に呼び出す必要があります。
C++ 14 標準では、コンパイラの動作が変わります。 2 番目のパラメーターの型が size_t
のグローバル operator delete
と operator delete[]
を定義すると、メンバー スコープのバージョンが呼び出されておらず、オブジェクトのサイズが有効なときに、コンパイラではそれらの関数を優先して呼び出します。 コンパイラで、サイズ引数が暗黙的に渡されます。 単一引数のバージョンは、割り当てが解除されているオブジェクトのサイズをコンパイラで判定できない場合に呼び出されます。 それ以外の場合は、呼び出す割り当て解除関数のバージョンを選択するのに、通常のルールが引き続き適用されます。 グローバル関数の呼び出しは、割り当て解除関数の呼び出しの前にスコープ解決演算子 (::
) を付加することによって、明示的に指定できます。
既定では、Visual Studio 2015 以降の Visual C++ にはこの C++14 標準の動作が実装されます。 これは、/Zc:sizedDealloc コンパイラ オプションを設定することで明示的に指定できます。 これは、潜在的な破壊的変更を表します。 以前の動作を保持するには、/Zc:sizedDealloc- オプションを使用します (例: コードで 2 番目のパラメーターの型に size_t
を使用する配置削除演算子を定義するとき)。 2 番目のパラメーターの型が size_t
のグローバル割り当て解除関数の既定の Visual Studio ライブラリ実装では、単一パラメーター バージョンを呼び出します。 コードで単一パラメーターのグローバル operator delete と operator delete[] のみを指定した場合、グローバル サイズ割り当て解除関数の既定のライブラリ実装では、グローバル関数を呼び出します。
/Zc:sizedDealloc コンパイラ オプションは、既定でオンになっています。 /permissive- オプションは、/Zc:sizedDealloc に影響しません。
Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成] ドロップ ダウン メニューで、[すべての構成] を選択します。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
/Zc:sizedDealloc または /Zc:sizedDealloc- が含まれるように [追加オプション] プロパティを変更し、[OK] を選択します。