戻り値の仕組みについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Fimbul
記事: 100
登録日時: 14年前

戻り値の仕組みについて

#1

投稿記事 by Fimbul » 13年前

コード:

#include <iostream>
using namespace std;

int hoge(int bar) {
	int foo = bar;
	return foo;
}

int main() {
	int fuga = hoge(7);
	cout << fuga << endl;
	return 0;
}
少し疑問に思った事があるので、質問します。

例えば、上の様なコードを考えます。
hoge関数はローカル変数int fooの値を返します。
そして、int fooが解放されるタイミングはhoge関数を抜けた瞬間だと思うのです。

疑問に思った所はhoge関数の戻り値でint fugaを初期化する所です。
もし、hoge関数内のint fooが解放されるタイミングがhoge関数を抜けた瞬間なら、int fugaを初期化する時にはint fooは解放されているはずで、初期化する値は消滅しているのではないかと思いました。

もしくは、関数の仮引数の様に、関数の戻り値を格納する変数が確保され、確保された変数に戻り値をコピーし、その変数でint fugaを初期化していると言う事でしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 戻り値の仕組みについて

#2

投稿記事 by softya(ソフト屋) » 13年前

戻り値用の見えない変数があると思って貰ったほうが良いと思います。
戻り値用の見えない変数には値コピーでコピーされます。
これが戻った先で更に変数にコピーされると言うことです。

return foo; foo → 戻り値用の見えない変数
int fuga = hoge(7); fuga ← 戻り値用の見えない変数

こういう仕組みなので、戻り値にクラスや構造体を使うことも出来ます。

[補足] 実際にはレジスタやスタックなどコンパイラの実装や最適化に依存して持って帰る方法は変わりますがイメージ的にはその通りです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Fimbul
記事: 100
登録日時: 14年前

Re: 戻り値の仕組みについて

#3

投稿記事 by Fimbul » 13年前

softya(ソフト屋) さんが書きました:戻り値用の見えない変数があると思って貰ったほうが良いと思います。
softyaさんありがとうございます。
気になっていた事なので、すっきりしました。

閉鎖

“C言語何でも質問掲示板” へ戻る