1

私は C を学んでいて、オンラインで読んだものについて混乱しています。

http://www.cs.bu.edu/teaching/c/stack/array/

私は読むことができました:

空と充足を決定する関数を見てみましょう。これらの関数はスタックを変更しないため、参照によってスタックを渡す必要はありません。したがって、次のようにプロトタイプを作成できます。

int StackIsEmpty(stackT stack);
int StackIsFull(stackT stack);

ただし、一部のスタック関数はポインターを使用し (たとえば、StackInit() などで必要)、一部は使用しません。常にスタックを参照によって (ポインターを使用して) 渡すだけの方が一貫性があります。

(stackT とは何かのコードは示していません。これは単なる動的配列です)

私の(おそらく限定的な)理解からすると、値渡しの欠点は、データが関数のスタックメモリに複製されることです。stackT は大きい可能性があるため、ポインターではなく値で渡すと時間がかかります。

私はそれを正しく理解していますか、それとも基本的なことはまだ明確ではありませんか?

4

2 に答える 2

3

「大きい」ものを値で渡すと、そのアイテムがスタックにコピーされます。

データへのポインターを渡すと、コピーが回避されます。

「大きい」が実際には「巨大」でない限り (スタックがオーバーフローする可能性がある)、ほとんどの実際のアプリケーションでパフォーマンスの違いが意味を持つかどうかは疑わしいです。

于 2013-10-30T00:16:43.137 に答える
1

あなたは正しいです。値を渡すと、プログラムはそのパラメーターのすべてのデータを完全にコピーします。1 つか 2 つの int だけであれば問題ありませんが、数キロバイトをコピーすると非常にコストがかかります。参照渡しでは、ポインタのみがコピーされます。
ただし、ポインターが指しているデータを変更してから、変更されずにデータに戻ることを期待することに注意する必要があります。C++ には「const 参照」による受け渡しがあります。これは、データが変更されないことを保証するようなものですが、C にはありません。

于 2013-10-30T00:18:52.423 に答える