0

新しいインスタンスが作成されるたびに、クラスはその非静的メンバー関数にメモリを割り当てる必要がありますか?

さらに細かく言えば、v3d3 空間ベクトルを表すクラスを作成する場合、次のように定義することでメモリ使用量を減らすことができますか?

static v3d::dotProduct(v3d v1, v3d v2)

とは対照的に

v3d::dotProduct(v3d v2)?

4

3 に答える 3

3

静的メンバー関数も非静的メンバー関数も、インスタンスごとに格納されません。非静的メンバー関数の場合、私が理解している方法は、それらが次のようなものに変換されることです(おそらくこれよりも読みにくい):

v3d_dotProduct(v3d this, v3d v2)

そして、それらへの呼び出しはそれに応じて翻訳されます。パフォーマンスを向上させたい場合は、インライン関数を使用することをお勧めします。これは、本質的に関数の内容を呼び出した場所にコピーするためです。これでメモリ使用量が減るとは思いませんが、1 秒間に何度も呼び出されるクラス関数 (静的および非静的) に使用する価値があります。

http://www.cplusplus.com/forum/articles/20600/

于 2012-05-03T00:23:30.423 に答える
2

メモリ内には関数のインスタンスが 1 つあります。静的かどうかは関係ありません。メンバー関数にメモリを割り当てません。

あるいは、私が誤解したのかもしれません。おそらく、関数が何らかの形でオブジェクト内のスペースを占有するという意味でしたか? いいえ、そうではありません。オブジェクト コード レベルでは、メンバーシップは基本的に単なる命名規則と隠し 'this' パラメータです。仮想の場合、通常は単一の vtable があり、すべてのインスタンスで同じです。

ただし、あなたの例では、すべての v3d オブジェクトを値で渡しているようです。これは、静的な場合は 2 つのオブジェクト コピー (引数ごとに 1 つ) を作成し、非静的な場合は 1 つのオブジェクト コピーのみを作成することを意味します。

参照によって引数を渡した場合、コピーを作成することを避けることができます-ドット積アルゴリズムで必要とされる場合を除いて、それが何であれ(私が数学を行ってから長い時間が経ちました)。

于 2012-05-03T00:22:24.930 に答える
1

どちらの場合も、関数のコードはコード メモリに 1 つのコピーしかありません。静的関数は同じ量のコード メモリを使用しますが、スタック メモリの使用量は少なくなります。これは、呼び出されたときにスタックに渡される引数が 1 つ少ないためです。非静的クラス メンバー関数には、呼び出されたときにスタックに追加される追加の引数 (this ポインター) があります。「this」ポインターを使用する必要があるオブジェクトで何も使用しない場合は、関数を静的に宣言する必要があります。

節約できるスタック メモリの量は、おそらく些細なものです。しかし、関数が 1 秒間に何百万回も呼び出される場合、静的関数は、スタックに追加の引数を渡す必要がないため、速度が向上する可能性があります。

于 2012-05-03T00:26:46.160 に答える