私の質問はC++クラスの定義に関連しています。クラスに多くのメンバー変数が存在する場合、私は理解しています。クラスのサイズが大きくなります。ただし、クラスメンバー関数の数を増やしても、そのサイズには影響しません。しかし、メンバー関数が多いクラスとメンバー関数が少ないクラスの主な違いは何だろうと思っていました。メンバー関数が少ないクラスの呼び出しがはるかに高速になる可能性はありますか?
4 に答える
メンバー変数を格納するにはインスタンスごとのスペースが必要ですが、メンバー関数はインスタンスの一部ではなく、少なくとも直接ではありません。通常、追加の仮想メンバー関数ごとに必要な追加のポインターが1つありますが、そのポインターは、クラスのすべてのインスタンス間で共有されるvtableに移動するため、メンバーごとのサイズには追加されません。
非仮想メンバー関数は、コードメモリ内でのみスペースを取ります。それらのスペース要件は、独立型関数と同じです。唯一の違いは、ポインターをに渡すための非表示パラメーターですthis
。
クラスに追加された最初の仮想関数は、インスタンスを格納するために必要なスペースへの追加のポインターを追加します。追加の非仮想メンバー関数は、スペース要件にはまったく影響しません。
いいえ、この点で違いを生む唯一の種類の関数は仮想関数であり、いくつ持っていても通常の種類よりも大幅に遅くなります。他のすべての場合、コンパイラは特定の関数が呼び出されたときに実行するコードを正確に認識しているため、検索を行う必要はなく、メソッドの数も重要ではありません。
いいえ、メンバー関数の数は、関数の呼び出し速度には影響しません(少なくとも適切な実装では)。関数の呼び出しはすべて、関数パラメーターを設定して呼び出し命令を使用するコードにコンパイルされます。コンパイラーは、コンパイル時に関数のアドレスを解決し、それを呼び出し命令で使用するか、仮想関数を使用して、呼び出すアドレスをテーブルで検索します。
関数が少ないクラスは、関数が多いクラスよりも効率的ではありません。
機能効率は、アルゴリズムとI/Oによって最も大きく影響されます。
ただし、コンパイル時間は影響を受けます。