0

私はいくつかのことを必要とする「プロセッサ」クラスを持っています: 1) データベースへのアクセスを許可するクラスのインスタンスへのアクセス。2) 文字列ユーティリティ クラスへのアクセス。3) 実行時に構成ファイルから読み取られるタイムアウト整数値。

したがって、メンバー属性として最初の 2 つへのポインターと、3 番目の単純な int 属性が必要です。通常、このような場合、コンストラクターに最初の 2 つのポインターと 3 つ目の int を取得させ、本体で、渡されたアイテムにメンバーを割り当てます。

問題は、このプロセッサ クラスの 100 個のインスタンスのようなプールを用意することです。各インスタンスに独自の (2) ポインターと整数属性を含めるのはメモリの無駄ではないかと考えています。ポインターは同じ 2 つのオブジェクトを指し、すべての整数はプロセスの存続期間を通じて同じ値を保持します。

私は「グローバルな状態は悪い」という概念に精通しており、静的メンバー属性の使用を思いとどまらせる印象を受けています。しかし、この場合、単純にこれら 3 つの属性を静的にする方が効率的ではないでしょうか。次に、2 つのポインターと整数を受け取り、渡された項目に静的メンバー属性を割り当てる静的な "initStaticMembers" メソッドを作成します。initStaticMembers は、プロセッサ インスタンスのプールが作成される前に 1 回呼び出されます。

私はその最後の部分 (静的な initStaticMembers メソッド) の大ファンではありません... あまり洗練されていないように見えますが、明らかに優れた代替手段が見つかりません。誰にも提案がありますか?そして、静的属性を使用すると、各プロセッサ クラス インスタンスに独自の属性インスタンス セットを与えるよりもメモリが節約されると考えるのは正しいでしょうか?

また、指しているクラスはスレッドセーフであるため、すべてのプロセッサがそれぞれへの単一のポインタを共有していることを気にする必要はないと思います。

フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

1

あなたが説明した状況を考えると、staticメンバーを使用すると実際にメモリが節約されます (この場合は非常に少量です)。

そして、2 つの条件を保証できるのであれば、ここでのスタティックの使用は安全で健全であると言えます。2 つの条件は次のとおりです。

  1. initStaticMembersこれらの静的メンバー データのいずれかが使用される前に常に呼び出されます。
  2. すべてのProcessorインスタンスの有効期間は、データベース アクセス クラスと文字列ユーティリティ クラスの有効期間の後に始まり、それらの前に終わります。

これらを保証できる場合 (たとえば、 のプールを管理するコードでProcessor)、問題ありません。適切なコーディング プラクティスとして、すべてのプロセッサが完了したら、値をゼロにして再度呼び出すようしてinitStaticMembersください。nullptr

一般に、データを回避staticすることは非常に優れた方法です。しかし、それはほとんどの場合、静的オブジェクトの有効期間 (および初期化の順序) を簡単に制御できないためです。ただし、静的ポインター メンバーは実際には何も所有しておらず、オブジェクトの有効期間を制御していないように見えます。これは良いことです。

要するに、注意すれば、この場合に静的メンバー データを使用しても問題はありません。ただし、ここではあまりメモリを節約していないことを再度強調する必要があります。

静的データが大きい (2 つのポインターと , よりも大きい) 場合は、未加工のポインターの代わりにint非静的shared_ptrs を使用してそれらを指すことをお勧めします。ただし、あなたの場合、shared_ptrデータ構造は共有データ全体よりも大きくなります。

于 2013-06-24T22:55:21.203 に答える
0

データベース クラスが真にアプリケーション グローバルなものである場合は、それをグローバルにします。いくつかのことは単にグローバルであり、戦いは読みにくいコードにつながります.

アプリケーションが自己完結型で、記述しているクラスがそのアプリケーションに固有のものである場合、多くの場合、Singleton パターンを利用して Application クラスを作成しても問題ありません。

Application::GetInstance().GetDatabase();

静的メソッドがある場所:

Application& Application::GetInstance()
{
    static Application app;
    return app;
}
于 2013-06-24T22:55:10.797 に答える