4

値のコピーで非参照/ポインター変数をconst初期化するときにオプションの修飾子を使用する場合の利点と欠点を知りたいです。

例えば:

  • void f(const T v)それ以外のvoid f(T v) // v does not need to be changed
  • if (const int err = f()) {/*...*/} それ以外のif (int err = f()) {/*...*/}
  • またはvoid f() {const T* const v = p; /*...*/}代わりにvoid f() {const T* v = p; /*...*/}

スタイルだけの問題ですか?C++11 標準はその例で何を使用していますか? constコンパイラが変数を特別な読み取り専用メモリ (一部の実装で) に格納するためのヒントになりませんか?

4

4 に答える 4

2

このような場合const、この変数は変更されないことになっていることを思い出してください。そのため、後で(おそらくずっと後で)この関数を変更する必要があるときに、誤って変数を変更したり、変数の不変性に依存するこの関数の他のコードを壊したりすることはありません。コンパイラはconst、変数の型(クラス)に簡単なコンストラクタがある場合にのみ、変数を読み取り専用メモリに格納します。

于 2013-03-15T10:32:01.533 に答える
1

constこれら 3 つのコンテキストでは、変数を変更できないことを意味します。しかし、省略しても、コンパイラは、変数が変更されていないことを認識します。最新のコンパイラは、変数へのすべての割り当てをチェックし、初期化が 1 つしかないことを検出します。

于 2013-03-15T10:37:44.900 に答える
1

いいえ、それは価値がありません。に基づくコンパイラ最適化の実際の例はありませんconst。などの変数を宣言してもメリットはありませんconst

于 2013-03-15T10:45:11.473 に答える
0

次のような関数プロトタイプ:

void f(const T& arg);

呼び出し元に次のように言います。 「参照渡しですが、渡された引数は変更しません。 」

しかし、値渡しの場合:

void f(const T arg);

コピーが作成されているため、渡された引数への変更は呼び出し元には表示されconstません。ただし、「引数のコピーが作成された後、このコピーはこの関数の実行中に変更されません」と書かれています。これは、この関数を実装する人がそれを絶え間ない。

しかし、将来コードを読む人がコードの設計を理解しやすくすることを除けば、const修飾子を使用してもここではあまり意味がありません。

于 2013-03-15T10:38:46.320 に答える