14

多くのベクトル、セット、マップを含むプロジェクトがあります。ほとんどの場合、キー/インデックスは整数です。次のような小さなクラスを作成することを検討しています。

class PhoneRepoIx //index into map {phone_number => pointer}
{
public:
  int n;
};

class PersonIx //index into map {social_security_number => pointer}
{
public:
  int n;
};

速度やメモリのペナルティはありますか? メモリを使用すると、インスタンスごとにメモリ コストがかからず、クラス タイプごとにのみコストがかかることを 90% 確信しています。スピードでは、私は明確ではありません。

動機: 上記のアプローチでは、コンパイラが追加の型チェックを行ってくれます。また、適切に選択された明示的な型名を使用すると、コードの読者は、私が何をしているかをより簡単に理解できます。今のところ、どこでも int を使用しており、各インデックスが何であるかを表す変数名を選択しました。上記により、私の変数名は短くなる可能性があります。

注: Typedefs は、コンパイラが追加の型チェックを行わず、内部的にすべての型が単に int になるため、私の問題に完全には対処しません。

4

3 に答える 3

6

コンパイラが異なれば、最適化能力もバグも異なります。これを正確にゼロのオーバーヘッドでコンパイルすることは、理論的には可能です。あなたのコンパイラはこの理論上の限界に達しますか? 答えは明確な「たぶん」です。少なくとも一部のコンパイラは、少なくとも時々それを行うことが知られています。

さらに興味深い質問は、パフォーマンスの低下の可能性について心配する必要があるかどうかです。そして、この質問への答えは強い「いいえ」です。プログラムが実際に許容できないパフォーマンス数値を示すまでは。

于 2012-07-19T19:43:11.013 に答える
4

テンプレートを使用して、必要なものを取得することをお勧めします。

template <typename T>
struct Index {
    Index(int value) : value(value) {}
    int value;
};

これはのように使用されます。

struct PhoneRepoIx {};
Index<PhoneRepoIx> PhoneIndex(1);
list[PhoneIndex.value];
于 2012-07-19T19:31:44.317 に答える
4

このクラスで一般的に呼び出される 2 つの関数があります。

  • コンストラクタ
  • operator< (STL マップはツリー実装であるため、キーはこれをサポートする必要があります)

上記の「心配しないで」という答えはかなり良いと思います(プロファイルしてから最適化します)。しかし、これが速度低下を引き起こさない理由を理解するには (推測):

  • コンストラクター: 適切なコンパイラーがこれをスタック ポインターのインクリメント (int 用のスペースを作成するため) に変換できず、その後に使用可能なスペースを設定できなかった理由はありません。
  • operator<: 適切なコンパイラが 2 つのオブジェクトの 'n' 間の単純な比較をインライン化できなかった理由はありません。
于 2012-07-19T19:52:38.137 に答える