2017-10-21 9 views
2

私にしつこいされての好奇心:C++の参照渡し:コールスタックはどのように使用されていますか?

は、この関数を考えてみましょう:

void add10(int& x) { 
    x += 10; 
} 

私は長い時間のためにC言語でプログラミングしてきたので、私はそれがこれを行うには意味を正確に知っている:

void add10(int *x) { 
    (*x)+=10; 
} 

xのアドレスは(リターンアドレス、ダイナミックリンクなどと共に)スタックにプッシュされ、関数自体が逆参照します。

しかし、最初のケースではコールスタックはどのように使用されていますか?それは単に第2の場合の構文上のショートカットですか?

+1

同じこと:通常、参照は内部的にポインタとして実装されます。それは主に構文的な砂糖です。 –

+0

_ "2番目のケースの構文ショートカットですか?"これは実装が定義されており、C++標準ではカバーされていません。 – user0042

+2

[それは何ですか](https://godbolt.org/g/mLS5cZ)アドレスをスタックにプッシュすることについては何ですか? – chris

答えて

2

コンパイラに依存するので、一般的な答えはありません。結果が正しい限り、必要な処理を実行できます。
通常、ポインタと同じ方法で処理されます。また、通常はインライン展開されるので、スタック上に何も置かれません(ただし、コンパイラとコンテキストに依存します)。

0

2番目のケースの単なる構文上のショートカットですか?

これは実装定義です。

通常、参照は内部的にポインタとして実装されているため、通常はyesです。


PS:第2のケースの仕組みについてのあなたの主張は正確ではありません。あなたはそれに再接近する必要があります。

関連する問題