3

C++ の可変変数について、次のような理解があります。

  1. 特別なストレージ クラスです。
  2. 可変変数は、定数オブジェクトによって変更できます。
  3. 変更可能な変数を使用したい場合の例は、特に要求されない限り、結果を取得するために高価な操作を実行したくない場合です。特に要求された場合、プログラムは操作を 1 回実行し、結果を可変変数にキャッシュします。

私の質問はメモリの観点からです。コンパイラは可変変数をメモリのどこに格納しますか? 変更可能であるため、確実に「読み取り専用」メモリにはなりません。

4

4 に答える 4

3

mutable( mutableconst ) は、 orのようなコンパイラの単なる型修飾子ですvolatile。クラスのメンバーは、メモリの連続したチャンクに格納されます (静的なものを除く)。メンバーを として定義してconstも、コンパイラがそれを RO メモリに配置するわけではありません。const宣言は実行時に何の影響も与えません。コンパイラがコンパイル中に適切なチェックと最適化を実行するための単なるキーワードです。クラス(またはメソッド)をとして定義してconstも、そのクラスの特定のメンバーを変更する必要があります(値をキャッシュするために、ミューテックスなど)。コンパイラーに、この特定のメンバーが であることを知らせmutableます。コンパイルエラーを取得します。

于 2015-08-16T05:31:56.157 に答える
2

おそらくこれはコンパイラ固有のものですが、ほとんどのコンパイラは、これを可能にするために、変更可能なメンバーを持つクラス (クラス全体) を常に非 const メモリに配置することを選択するだけだと思います。

于 2015-08-16T05:18:11.600 に答える
2

それは完全にコンパイラ次第であり、エスケープ分析を実行して、オブジェクトが決して変更できないと判断する可能性があります。その場合read-only、バイナリのセクションに書き込まれる可能性があります。mutableストレージ クラス指定子は、コンパイル時間の要件を緩和するだけです。

ただし、オブジェクトは宣言順に割り当てる必要があるため、ストレージ クラス指定子に関係なく、すべての変数はメモリの同じ領域にあります。ただし、マシンがサポートしている場合、バイトread-onlyの領域にビットを設定することを妨げるものは何もありません。const

于 2015-08-16T06:00:31.177 に答える
1

クラスのすべてのメンバーのサイズ ( によって決定されるsizeof) は、少なくとも1です。これはメンバーにも当てはまり、mutableすべてのクラス メンバーがメモリ内のある範囲の場所を占有する必要があることを意味します。

メンバーの唯一の特別な点は、オブジェクトmutable内であっても値を変更できることです。constそれをどのように達成するかは、コンパイラ次第です。通常、コンパイラはコンパイル時に constness を適用します。つまり、オブジェクトがでありconst、そのメンバーも論理的constには であり、いずれかのメンバーで変更 (または非操作の呼び出し) を試みた場合、そのメンバーがconstでない限り、コードはコンパイルされませんmutable

実際にはconst、実行時にオブジェクトまたはそのメンバーを読み取り専用メモリにポップする必要はありません。それが実際に行われるmutable場合、他のメンバーへの変更が防止されたとしても、そのメンバーを変更できるようにするための特別な処理が必要になります。たとえば、オブジェクトのすべてのメンバーを変更可能なメモリに配置し、可変でないものだけを (オペレーティング システムのサポートなどで) マークして、実行時に変更できないようにすることができます。

可変メンバーを使用する一般的な理由は、繰り返し可能な高価な操作からの結果を格納することです (同じ入力に対して同じ結果を与える)。結果が必要ない場合は、高価な操作も必要ありません。結果に繰り返しアクセスする必要がある場合、変更可能なメンバーを使用すると、コストのかかる操作を繰り返し実行するのではなく、最初に結果を格納できます。

于 2015-08-16T06:04:03.090 に答える