/vmm/vms/vmv (汎用表現)

処理形式として /vmg が選択されている場合に使用されます。 これらのオプションは、まだ検出されていないクラス定義の継承モデルを指定するものです。

構文

/vmm
/vms
/vmv

[オプション]

/vmm
クラス メンバーへのポインターの最も汎用的な表現を、複数継承を使用するものとして指定します。

#pragma pointers_to_members に対応する継承キーワードと引数は、multiple_inheritance です。

この表現は、単一継承に必要な表現よりもサイズが大きくなります。

/vmm を使用して、仮想継承モデルを持つクラスのメンバーへのポインターを宣言すると、コンパイラでエラーが生成されます。

/vms
クラス メンバーへのポインターの最も汎用的な表現を、継承も単一継承も使用しないものとして指定します。#pragma pointers_to_members に対応する継承キーワードと引数は、single_inheritance です。

このオプションを使用した場合、クラス メンバーへのポインターの表現が最小限のサイズで生成されます。

/vms を使用して、複数継承または仮想継承モデルを持つクラスのメンバーへのポインターを宣言すると、コンパイラでエラーが生成されます。

/vmv
クラス メンバーへのポインターの最も汎用的な表現を、仮想継承を使用するものとして指定します。 このポインター表現では、エラーが発生する可能性はありません。これが既定値となります。

#pragma pointers_to_members に対応する継承キーワードと引数は、virtual_inheritance です。

このオプションを使用した場合、より大きいサイズのポインターが必要となり、ポインターを解釈するのに、他のオプションよりも多くのコードが必要となります。

解説

Visual Studio 2019 以前のバージョンでは、メンバーへのポインターの型に、複数の異なる表現 (サイズが異なります) が使用されます。 継承も単一継承もないクラスのメンバーへのポインターは、表現のサイズが最小限になります。 複数継承があるクラスのメンバーへのポインターは、サイズがより大きくなります。 仮想継承があるクラスのメンバーへのポインターは、サイズが最も大きくなります。 コンパイラに対して表現モデルが指定されていない場合は、既定で、最もサイズの大きい表現 (最も汎用的な表現) が使用されます。

これらの継承モデル オプションのいずれかを指定した場合は、継承の種類や、クラスの前後どちらでポインターを宣言したかに関係なく、指定したモデルがクラス メンバーへのすべてのポインターに使用されます。 常に単一継承のクラスを使用する場合は、/vms を使用してコンパイルすることで、コード サイズを減らすことができます。 ただし、最も汎用的なケースを使用したい場合は (データ表現のサイズが最も大きくはなりますが)、/vmv を使用してコンパイルしてください。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション] ボックスにコンパイラ オプションを入力します。

このコンパイラ オプションをコードから設定するには

関連項目

/vmb, /vmg (処理形式)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文