2017-02-14 12 views
7

私はhereからの回答を理解していると思いますが、私は明示的に以下について尋ねたいと思います(同じ質問だと思うと私の謝罪ですが、私には違う感じです)の懸念に:ポインタへの参照または値のコピー

func f() *int { 
    d := 6 
    pD := new(int) 
    pD = &d // option 1 
    *pD = d // option 2 
    return pD 
} 

ポインタが性能面であるように私はただの参照をコピーし、最初のオプション、より最適な(これは教育の推測ですが、それは明白なようです)。私はこの方法/パターンを好むだろう。

2番目のオプションは代わりに(浅い)コピー(?)です。私が推測しているのは、このメソッドは、コピーするので、私はGCが 'd'のインスタンスをスイープすることについて懸念していません。私はしばしば私の不安(または初心者としての無知)のためにこの方法を使用します。

私が心配しているのは、最初の方法( 'd'のアドレスが転送される)でGCがそれ( 'd'変数)がポインタコンテナなので、それは掃引されませんか?したがって、代わりにこのメソッドを使用するのが安全でしょうか?私。アプリケーションの存続期間中、func 'f()'から返されたポインタ 'pD'を安全に渡すことはできますか?

参考:https://play.golang.org/p/JWNf5yRd_B要するに

答えて

9

公式ドキュメントよりも、見には良い場所はありません。

func NewFile(fd int, name string) *File { 
    if fd < 0 { 
     return nil 
    } 
    f := File{fd, name, nil, 0} 
    return &f 
} 

注C、とは異なり、それはローカル変数のアドレス を返すように完全にOKだ、ということを。変数に関連付けられた記憶域は、関数が返された後には のままです。実際、コンポジットアドレス のリテラルを使用すると、評価するたびに新しいインスタンスが割り当てられるため、 はこれらの最後の2行を結合できます。

(ソース:"Effective Go"

だから、最初のオプションは、(ローカル変数へのポインタを返す)絶対に安全とさえを奨励しています。 escape analysisを実行することにより、コンパイラは変数がローカルスコープをエスケープし、代わりにヒープ上に割り当てることができます。

3

:いいえ

まず:ゴーには、 "参照" はありません。今、このアイデアを忘れてください。さもなければ、あなた自身を傷つけるでしょう。本当に。 「参考文献」について考えることは間違っています。

2番目:パフォーマンスはまったく同じです。このタイプのナノ最適化について今は忘れてください。特にintを扱う場合。パフォーマンスの問題がある場合のみ:測定し、最適化します。直感的には、「8バイトの小さなポインタを渡すことは、30バイトまたは100バイトの構造体をコピーするよりはるかに高速でなければならない」と考えるのが魅力的かもしれません。そうではない、少なくともそれは単純ではない。

第3位:func f() *int { d := 6; return &d; }と書いてください。ここで空想的なダンスをする必要はありません。

第4:オプション2はintの「ディープコピー」を作成します。しかし、intの "浅いコピー"が存在しないので、これは誤解を招くかもしれません。だから私があなたがここで何を求めているのか分かりますか? Goには、浅いコピーと浅いコピーという概念がありません。ポインタ値をコピーすると、ポインタ値がコピーされます。あなたは最初の点を覚えていますか? Goには参照がありません。ポインタ値は、コピーされた場合にポインタ値のコピーを持つ値です。そのようなコピーは、指摘された価値には全く何もせず、特にコピーをしません。これは、Goのコピーが「深い」ものではないことを示唆します。 Goについて話すときは、深い/浅いコピーを忘れてしまいます。 (もちろん、あなたがあなたのカスタムオブジェクトの「ディープコピー」を実行する機能を実装することができます)

フィフス:Goは 適切 作業ガベージコレクタを持っています。それはあなたがしていることとはまったく違いはありません。オブジェクトが生きている間は、それは収集されず、いったん収集されればそれはなります。あなたは、渡すことができます返す、コピー、手渡し、アドレスを取る、逆参照ポインタまたは好きなもの、それは問題ではない。 GCは正常に動作します。 (パッケージが安全でないことを使用して意図的に痛みやエラーを探している場合を除きます。)

関連する問題