1

重複の可能性:
参照渡しと値渡しの違いは何ですか?

タイトルが他の多くの回答済みの質問を表している可能性があることは知っていますが、私の非常に具体的な質問は他のスレッドでは回答されていないと思います (検索しましたが、重複していれば申し訳ありません)。

ビジネスへ: 次の署名を検討してください:

A:

void MyFunction(long int x);

B:

void MyFunction(long int & x);

そして次の使用法:

void main()
{
  short int y = 0;
  MyFunction(y);
  ...
}

私の質問は、MyFunction のメモリ スタック フレーム内のパラメータのメモリ消費に関するものです。

  1. A の場合、パラメータは値で渡されますが、sizeof(short int) バイトを消費するということですか?

  2. B の場合、コンパイラがポインタを使用してパラメータを実装すると仮定すると、パラメータは参照によって渡されますが、それは sizeof( pointer_type ) バイトを消費することを意味しますか?これはおそらく short int よりも大きいですか? (参照を使用する場合、プラットフォームによってはとにかく64ビットを消費する可能性があると言われました)

どちらの場合も効果があるかどうかを知りたいので、関数は long int 型を受け取ることに注意してください。

もう 1 つの小さな質問 - ポインターを使用して参照渡しパラメーターをコンパイラーが実装しない例を誰でも投稿できますか?

ありがとう、アサフ。

4

1 に答える 1

2

答えは、コンパイラ、アーキテクチャ、ABIなどによって異なります。

以下では、問題のパラメーターが実際にはレジスターではなくスタックに渡されていると仮定し (大きな仮定です!)、積極的な最適化は行われていません。

A の場合、パラメーターは値で渡されますが、sizeof(short int) バイトを消費するということですか?

いいえ、の署名sizeof(long int)に一致するように最初に拡張されるため、バイトを消費します。MyFunction()

ケース B では、パラメーターは参照によって渡されます。コンパイラーがポインターを使用してそれを実装すると仮定すると、sizeof(pointer_type) バイトを消費することを意味しますか?

一言で言えば、そうです。aが期待されるshort&場所に aを渡すことはできないので、ここで a を渡すことを意味していると思います。long&long&

于 2012-12-18T14:41:58.473 に答える