0

たとえば、文字列 { "ALPHA", "BETA", "GAMMA", "OMEGA" } のリストを列挙したいとします。これを行うには、次の 2 つの方法があります。

--- Method 1 ---
string getType(int a)
{
   switch(a)
   {
      case 0: return "ALPHA"; 
      case 1: return "BETA";
      case 2: return "GAMMA";
      case 3: return "OMEGA";
   }
}

または、文字列の配列を作成し、それを使用して対応する文字列要素を返すこともできます。

--- Method 2 ---
string data[] = { "ALPHA", "BETA", "GAMMA", "OMEGA" };
string getType(int a)
{
     return data[a];
}

(非常に大きなデータ セットを想定して) コンパイラはこれら 2 つの方法をどのように処理しますか? 最終的なアセンブリ コードはどのようになりますか? ある方法は他の方法よりも要素を取得するのが速いですか? メモリ内でより多くのスペースを必要としますか? それとも同じマシンコードに変換されますか?

私の最善の推測では、方法 2 はより高速に動作しますが、配列用のスペースが必要になるため、メモリ内のスペースも多く占有します。一方、メソッド 1 は getType(..) が呼び出されるたびに時間がかかりますが、変数はアセンブリ コマンドにのみ格納されるため、必要なメモリは少なくて済みます。しかし、C++ や他の言語のコンパイラがコードをどのように処理し、まったく異なるものを生成できるかはまだわかりません。

4

1 に答える 1

1

配列を使用するだけです。多数の文字列の場合は明らかにより効率的であり、少数の文字列の場合は、switch ステートメントで配列を使用するオーバーヘッドはとにかく取るに足らないものです。クレイジーなことをしないことを学ぶことの利点は、追加のオーバーヘッドに見合うだけの価値があります。:-)

違いを本当に分析したい場合は、実行しているマシンのリソースに依存する可能性があることがわかると思います.1つのアプローチは明らかにメモリを集中的に使用し、もう1つのアプローチはCPUを多く使用するためです.

于 2013-03-05T20:34:24.750 に答える