Go でスタック上のポインタを返す
C では、関数からスタックで作成された変数へのポインタを返すと問題が発生する可能性があります関数が戻った後にメモリが破棄され、ポインタが無効になる可能性があるためです。ただし、Go では動作が異なります。
Go では、Go コンパイラーがエスケープ解析を使用して変数が指す値かどうかを判断するため、スタックで作成された変数へのポインターを関数から安全に返すことができます。関数が戻った後に使用できます。コンパイラは、関数が戻った後に変数が参照されていないことを証明できない場合、ダングリング ポインタ エラーを回避するために、変数をガベージ コレクション ヒープに自動的に割り当てます。
この最適化は、-gcflags - を使用して確認できます。コンパイル時に m オプションを使用します。以下に例を示します:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
このコードを実行すると「a」が出力され、Go でスタック作成変数へのポインタを安全に返すことができることがわかります。
以上がGo はスタックに割り当てられた変数へのポインタを安全に返すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。