4

const よりも #define を使用することの利点と欠点 (およびその逆) は何ですか?

悪いプログラミング プラクティス、特にマジック ナンバーについて読んだとき、#define をより頻繁に使用していることに気付きました。次のようないくつかの質問が頭に浮かびました。

#define をたくさん使うのは悪いことですか?
それはメモリスペースを必要としますか?
代わりに const を使用した方が速いでしょうか?

私はこれについて少し読みましたが、私が理解したことから、まだわかりません:
#define はマクロを定義し (マクロの意味がわからない)、前処理を扱います。コードが処理される前に、定義されたキーワードのすべてのインスタンスを別のものに置き換えます。一方、 const は、実行時に途中で値を変更できない変数です。

const の使用を考えられる唯一の理由は、値が他の変数に依存している場合です。例えば:

#define PI 3.14159f
#define RADIUS 3.0f
#define AREAOFCIRCLE PI*RADIUS*RADIUS

AREAOFCIRCLE のすべてのインスタンスが PI*RADIUS*RADIUS に置き換えられるため、AREAOFCIRCLE を使用するたびにプログラムが計算するため、非効率的です。一方で:

const float areaofcircle = PI*RADIUS*RADIUS;

プログラムは一度しか計算しないため、より効率的です。

元の質問に戻りますが、#define は const と比べてどうですか?

4

3 に答える 3

10

これらはすべてコンパイル時に計算されるため、この場合の効率について心配する必要はありません。

できる限り、(少なくとも定数を定義するために) マクロの使用を停止する必要があります。マクロは、名前空間とスコープに対してワイルドなものです。一方、constオブジェクトにはがあり、これにより意図しないミスを減らすことができます。

Stroustrup の次のアドバイスを読むことは常に役に立ちます。

于 2013-10-27T08:00:36.147 に答える
4

C++ の「const」は非常に貴重です。const は、「#define」された定数が展開されている間、式の型チェックを強制します。

さらに、定数が型付けされているため、コンパイラーはより適切な最適化を妨げる可能性がありますが、定義を推測する必要があります (1.0 は float または double ですか? 1.0d または 1.0f のようにサフィックスを使用すると役立つ場合がありますが、意識的に書かれた実数はめったに見ません. ..)。

したがって、定数の定義には const を使用します

const float PI = 3.14159f;
const float RADIUS = 3.0f;
const float AREAOFCIRCLE = PI*RADIUS*RADIUS;

少なくとも同じコンパイル時間の最適化 + いくつかの追加の型チェックが得られます。

于 2013-10-27T08:02:59.313 に答える
-1

「const」は、一度メモリを占有し、あらゆる場所で参照されるため、より効率的です。対照的に、「#define」は、どこで使用してもスペースと追加操作を占有します。

于 2013-10-27T08:17:48.400 に答える