10

Meyers の本 (項目 2 "Prefer const to #define) を読んで、以下にリストするいくつかの文を理解したいと思います。

  1. #define ASPECT_RATIO 1.653const aspect_ratio = 1.653Meyersの比較を参照して、 「... 浮動小数点定数の場合 (この例のように)、定数を使用すると、 を使用するよりもコードが小さくなる可能性があり#defineます。」質問は次のとおりです。コードが小さいと、マイヤーズは実行可能ファイルのディスク上のスペースが小さくなることを意味しますか? 小さいのはなぜですか?intこの場合、 (またはポインター)には4バイトと2倍の8バイトが必要なため、これは32ビットのシステムで有効である可能性があると思いました。シンボル テーブルに入力されない可能性があるためASPECT_RATIO、名前は値に置き換えられますが、それ以外の場合は、const一意の double 値へのポインター。この場合、この概念は 64 ビットのマシンでは有効ではなくなります (ポインターと double は同じバイト数であるため)。私が言いたいことをうまく説明したかどうかわかりませんが、特にこの考えが正しいかどうかはわかりません。

  2. それから Meyers は次のように尋ねます: " ...良いコンパイラはconst(オブジェクトへのポインタまたは参照を作成しない限り) 整数型のオブジェクト用のストレージを確保しませんが、ずさんなコンパイラはそうかもしれませんし、あなたはそのようなオブジェクトのためにメモリを確保しようとはしないかもしれません。オブジェクト...」この文脈では、メモリは実行中のプロセスによって占有されているRAMですか?これを確認するのが正しければ、タスク マネージャー (Win の場合) またはトップ (Linux の場合) を使用できますか?

4

2 に答える 2

7

まず、マイクロ最適化はばかげています。すべての RAM を食い尽くすいくつかの一定の double 値を気にしないでください。それは起こりません。もしそうなら、それが関連していることに気付く前に、それを処理してください。

第 2 に、慣習に従って#defineも、使いすぎると厄介な副作用が生じる可能性があります。ALL_CAPS_DEFINES遅かれ早かれ、他の変数の名前で使用される短いマクロを誤って作成し、プリプロセッサの置換により、計り知れない回避可能なエラーが発生し、デバッグ可能性がまったくなくなります。質問のコメントのリンクされた質問にあるように、マクロには名前空間とクラスのスコープがなく、C++ では間違いなく悪いです。

3 番目に、C++11 は を追加しますconstexpr。これにより、タイプセーフなマクロ実行 (この誤称が意味するものは何でも) の定数式が可能になります。コンパイル時にconstexpr. 残念ながら、すべての主要なコンパイラが C++11 のサポートを主張しているわけではありませんが、実際には、本当に役立つ C++11 機能を十分にサポートしているわけではありません (MSVC2012 を見ています!)。

于 2013-01-03T14:21:59.323 に答える
1
  1. より小さなコードが生成される「可能性がある」理由は、define を複数回使用すると、おそらく (おそらく: オプティマイザーが奇妙なことを行う)、同じ定数を何度も生成するためです。一方、const を使用すると、1 つの定義のみが生成され、同じ定義が参照されます (オプティマイザーがインラインで計算しない場合)。
  2. リンカーは、実行可能ファイルをリンクするときにいくつかの部分を出力します。一部には定数が含まれており、他の一部には実行可能コードが含まれています。(オペレーティング) システムが実行前に実行可能ファイルを RAM にロードするかどうかは、C++ 標準では定義されていません。コードがフラッシュ ストレージから実行されるシステムを使用したので、スタックと動的に割り当てられたメモリのみが RAM を使用します。
于 2013-01-03T14:57:37.133 に答える