1

提供された文字列内にパターンがあるかどうかをチェックする関数があります。パターンは事前定義されており、それらの多くが利用可能です。例:

  const char* a1 = "apple";
  const char* a2 = "Orange";
  const char* a3 = "mango";
  const char* a4 = "grapes";
  ...
  ...
  ...
  const char* an = "Banana";

PS:a1、a2、a3はすべて、クラスFRUITのメンバー変数です。そして、値の割り当てはコンストラクターで行われます。私は機能を持っています:

 void FindPattern(sample_String, predefined_string)
  {
     if(strstr(sample_string,predefined_string))
     {
      do sth...
     }
     else
       do another thing

   }

したがって、私の疑問は、predefstrings(a1からan)を示す列挙型を作成し、それらを関数に渡し、switchケースなどで、「apple」「orange」値をローカルに割り当てる方がよいということです。このアプローチは、コンストラクターで初期化するよりも少ないメモリを使用しますか?

4

3 に答える 3

2

ここで、どのメモリを最適化するかがよくわかりません。

それが実際のメンバーであり、それらの型が実際にであると仮定するとconst char*、これらの文字列はコンパイル時定数への単なるポインタです。これらの定数は、(ほとんどの場合)スタックまたはヒープの外側の一定のメモリ領域内に配置され、実行が開始される前に、プログラムをメモリにロードすることによってのみ「初期化」されます。したがって、文字列はプログラムの結果のバイナリのどこかに格納する必要があるため、最適化するためのメモリ使用量は実際にはありません。

したがって、このクラスのインスタンスに実際に使用しているメモリは、文字列ごとに1つのポインタだけです。これらのポインタが各インスタンスで同じである場合は、それらを作成できますstatic。これにより、意図がより明確に示されます。それらが実際にオブジェクト間で異なる場合、実行できる最適化はありません。いずれの場合も、これはメモリの量が非常に少ないため、影響はないはずであり、時期尚早の最適化を検討している可能性があります。

于 2013-01-16T12:53:59.467 に答える
0

すべてのインスタンスが同じセットを共有a1,a2,...,anし、コンストラクターでそれらを設定した後に変更されない場合は、次のように、それらをstaticのメンバーにすることをお勧めします。Fruit

class Fruit {
  static const char* const a1;
  static const char* const a2;
  //...
  static const char* const an;
};

// In Fruit.cpp:
static const char* const Fruit::a1 = "apple";
static const char* const Fruit::a2 = "orange";
//...
static const char* const Fruit::an = "banana";

a1,a2,...,anすべてのインスタンスは、メモリを無駄にすることなくメンバーを共有します。

于 2013-01-16T12:50:49.593 に答える
0

いいえ。どちらの方法でも文字列定数が必要です。

于 2013-01-16T12:39:51.440 に答える