2013-10-16 69 views

回答

2

在這兩種情況下,Vertex結構都以相同的方式初始化。

第一個表達式返回一個初始化的Vertex結構體的值。使用6g的對齊規則,這意味着您將獲得8 + 8 = 16字節的Vertex結構,因爲每個float64的大小爲8個字節。 第二個表達式分配內存,足夠8 + 8 = 16個字節,將它用作Vertex結構,初始化它並返回一個指針,它的大小爲4或8個字節,具體取決於您的體系結構。

實踐中有許多差異。這兩個值的方法集,Vertex結構和* V​​ertex指針可能不同。根據您需要繞過Vertex結構的頻率,將指針傳遞給它可能會或可能不會更高效。如果您將Vertex結構傳遞給函數,該函數將獲得副本,並且您的Vertex結構將永遠不會被修改。如果您傳遞* Vertex,則可能會更改您的底層頂點。這可能或可能不是你的意圖:)

2

TL; DR沒有區別。是否在堆棧或堆上分配變量取決於其用法。

我做了一個deep dive上的程序集生成從各種初始化和調用情況。在vb之間生成的程序集幾乎相同。特別值得注意的是,d未被分配到堆棧。

什麼決定了變量是堆分配還是堆分配是它的使用方式。將傳遞指針傳遞給僅將該參數用作值的函數不會強制變量被堆分配。但即使這並不能保證,該規範允許任何Go編譯器根據需要在堆棧和堆之間自由移動變量以進行優化或代碼生成。正如C/C++抽象掉RAM vs Register一樣,去abstracts away Heap vs Stack

http://play.golang.org/p/vJQvWPTGeR

type Vertex struct { 
    X, Y float64 
} 

func PrintPointer(v *Vertex) { 
    fmt.Println(v) 
} 

func PrintValue(v *Vertex) { 
    fmt.Println(*v) 
} 

func main() { 
    a := Vertex{3, 4} // not allocated 
    PrintValue(&a) 

    b := &Vertex{3, 4} // not allocated 
    PrintValue(b) 

    c := Vertex{3, 4} // allocated 
    PrintPointer(&c) 

    d := &Vertex{3, 4} // allocated 
    PrintPointer(d) 
} 

:技術上不正確的,但如果fmt.Println(*d)已經代替將是真實的。我騙了一些回答我認爲你應該問的問題。