私は現在、レガシー C コード (SPICE バリアント) を組み込んだパフォーマンス クリティカルなアプリケーションに取り組んでいます。
問題は次のとおりです。
従来の C コードの作成者は、引数の受け渡しの使用が現代の大きな悪の 1 つであることを明らかに信じていました。したがって、すべての変数の約 90% がグローバルに宣言されました。
レガシ コードは、シミュレーションのために繰り返し呼び出す必要があり、このコード セクションへの同時呼び出しにスレッドを使用すると、全体の実行時間に有利になる可能性があります。
私のアイデアは、レガシー コードの複数のオブジェクトを作成して、多くのミューテックス ロックの必要性を排除できるように、レガシー C コード (g++ コンパイル用に既にわずかに変更しています) をカプセル化することでした。明らかに、グローバル変数はメンバー変数としてカプセル化されます。
これにより、別の問題がテーブルにもたらされました。従来のコーダーは、グローバル変数の初期化も信じていませんでした。おそらく、C はグローバル変数を 0 に初期化する傾向があるためです。ただし、C++ メンバー変数は、同じ処理を取得するために継ぎ目はありません。従来の C コードを正しく動作させるには、いくつかの変数を 0 に初期化する必要があります。しかし、膨大な量のグローバル変数が使用されているため、これらの変数を見つけることは非常に難しいことがわかっています。
レガシ C コードを大幅に変更する時間はありません。
私の質問は次のとおりです。
C コードのカプセル化は、約 90 個のミューテックス ロックを使用するよりも高速であるという仮定は正しいですか?
初期化されていないメンバー変数の使用を見つける簡単な方法はありますか? (私が理解しているように、gccは自動変数に対してのみこれを行うことができます)。重要な変数のみを初期化できるようにするには?
質問 2 ではない場合 ... 通常のコンストラクターの init メソッドを使用せずに、すべてのメンバー変数を初期化する高速でクリーンな方法はありますか?
または(ロングショット)自分自身を渡す引数を組み込むことができるように、プログラムフローに従う高速な方法はありますか?
どんな助けでも大歓迎です。注意