2016-05-08 4 views
1

私はC(およびCの構造体)を新しくしました。そして、私はインターネット上で様々なコード例を見てきましたが、このことの利点です:割り当て時に膨大なメモリ空間を占める非常に大きな構造体があると仮定します。

void foo(LargeStruct* struct);

の代わりに、この

void foo(LargeStruct struct);

それはメモリ管理を容易にしていますか?

+0

んが、それはないん。 –

答えて

4

前者は構造体へのポインタを関数に渡します。後者は構造体のコピーを作成し、それを関数に渡します。構造体が大きい場合、関数のコピーを作成するのは高価(多くのリソースを使用する)なので、必要でない限り避けるべきです。

4

Cは、値でstructを渡します。つまり、2番目の署名を持つ関数は、fooに渡すために、LargeStruct全体のコピーを作成するということです。これは、メモリ使用に関して経済的ではない。

さらに悪いことに、LargeStructの割り当てはの自動メモリ(「スタック上」とも呼ばれます)で発生します。 structの実際のサイズによっては、スタックオーバフローを引き起こす可能性があるため、一部のシステムでは呼び出しができない場合があります。

一方、第1のアプローチはポインタでstructを渡します。ポインタのサイズは、LargeStructのサイズに依存しません。

+0

"Cは値によってパラメータを渡す"のように、最初の文を改訂する必要がありますか? –

+0

@FiddlingBits実際はそうではありません。Cは、ポインタに崩壊する配列の例外を作成します。 – dasblinkenlight

3

Cは引数を値で渡しているので、二つの主要なポイントがあります。void foo(LargeStruct struct);の場合には、あなたが得るように、関数本体で

  1. が、あなたは、渡されたパラメータのコピーを受信します構造体のコピーは、構造体のメンバを変更したときに、実際には外部には見えません。これは一時的なコピーであり、関数が復帰すると破棄されるためです。したがって、構造体を変更したい場合は、その構造体へのポインタを渡す必要があります。

  2. 引数がコピーされ、構造体が本当に大きい場合、メモリオーバーヘッドがあります。これであなただけのメモリのオーバーヘッドを最小限に抑えるために、構造体を変更したくない場合、あなたはのconstポインタを渡すことができます。

    foo(const LargeStruct *p);

関連する問題