2016-06-19 2 views
1

関数に変数を渡すことなく関数を呼び出すだけで、関数の戻り値がどうなっているのか不思議です。それはどこに返されますか?誰がそれを持っていますか?それはどれくらいの期間保持されますか?関数に戻り値が返されます。誰がそれを持っていますか?それはどれくらいの長さですか?

以下の例は、スウィフト

func returnFun(input: String) -> String { 
    return(input) 
} 

returnFun("Who Am I?") 

returnFunによって書かれている関数の名前であり、それはあなたが文字列自体として引数の中に置かれた任意の文字列を返します。文字列私は誰ですか?は議論に入れられましたが、どこに行くのですか?誰がそれをキャッチしますか?それとも、帰った直後に破壊されますか?

おかげで、あなたの時間を多くして、関数の戻り値を格納(または使用)していない場合は

+0

あなたは[コールスタック](https://en.wikipedia.org/wiki/Call_stack)に精通していますか? –

+0

@Will Nessいいえ私はコールスタックにはまったく慣れていません。勉強の方向を教えてくれてありがとう – SLN

答えて

4

を助けるが、それは単に破棄されます。

このプロセスでは、呼び出し元に(通常はCPUレジスタまたはスタックを介して)戻り値が返され、そこから呼び出し側が呼び出し元に返します。値は、(あなたの例のように)構造体や文字列として、「機械語」(単一のレジスタに収まる何か)よりも大きいとき


物事はもう少し面白く。それらは、他の場所のメモリ位置へのポインタとして渡す必要があり、何とかそのメモリを管理(割り当て、解放)する必要があります。

ここでの主な概念の違いは、「値型」と「参照型」です。スウィフト文字列は値の型で、コピーされます(少なくとも概念的には、同じ観察可能な振る舞いをもたらす限り、実装がより効率的になるように異なる場合があります)。関数を呼び出すと、呼び出し元から呼び出し元の文字列が関数のローカル変数inputにコピーされ、返されたときに再度コピーされ(すぐには破棄されない)、そのことを考えることができます。

+0

発信者がそれを受け取らないと決めた場合、「スペース」が他の返品によって占有されるか、単に破棄されるまで、そこに残ります。 – SLN

+1

戻り値は計算され、コンパイラが本当に巧妙なやり方をしない限り、決して使用されません。しかし、そのスペースはすぐに他のものに再利用されます。 – Thilo

+1

この場合も、「参照型」ではもう少し複雑になります。参照のみが関数の中で渡され、多くの参照が同じものを指すことができ、メモリ管理が複雑になります(Swiftは参照カウントを使用し、他の環境はガベージコレクションを使用します)。 – Thilo

関連する問題