Go でスタック上のポインタを返す: 公開
C プログラミングでは、スタックに割り当てられた変数へのポインタを返すと問題が発生する可能性があります、関数が戻った後にメモリが破棄されるためです。ただし、Go では、スタックで作成された変数へのポインタを返すことは安全であるだけでなく、一般的な方法でもあります。
エスケープ解析を利用して、Go はスタックからエスケープする値 (現在のスコープ外で参照される可能性のあるポインタ) を自動的に割り当てます。 ) をヒープに追加します。これにより、変数の割り当て場所を気にする必要がなくなります。
Go の FAQ に記載されているように、「変数がヒープに割り当てられているかスタックに割り当てられているかを確認するにはどうすればよいですか?」:
if the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors
コンパイラーの最適化の選択を確認するには、コンパイル中に -gcflags -m オプションを使用します。これにより、Go がさまざまなシナリオでメモリ割り当てをどのように管理するかについての洞察が得られます。
例:
次の Go コードを考えてみましょう:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
Inこの例では、関数 something はスタックに割り当てられた変数へのポインタを返します。ただし、Go のエスケープ解析により、コンパイラは返されたポインタが関数のスコープ外で使用されていることを認識し、変数をヒープに割り当てます。これにより、ポインターが有効で逆参照可能な状態が保たれます。
以上がGo でスタック割り当てポインタを返すことは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。