亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有一種慣用的方法來 malloc 和 memcpy 結構?

有沒有一種慣用的方法來 malloc 和 memcpy 結構?

Go
慕妹3146593 2022-06-27 10:19:37
在純 C 語言中,如果我想要一個結構的淺堆副本,我malloc()會這樣做memcpy()。在 Go 中,我想我必須這樣做:original := Data{...}copy := &Data{}     // malloc*copy = original    // memcpy但這對我來說并不好看,也不慣用。什么是“正確”的做法?
查看完整描述

2 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

慣用的方法是做一個簡單的賦值,讓編譯器copy在執行逃逸分析后在堆上分配:


original := Data{...}

copy := original

return &copy  // Or call some function with &copy as a parameter

在注意到它copy被引用使用并且超過堆棧時,Go 將自動在堆上而不是在堆棧上分配它(當然,復制仍然正確完成)


我們實際上不再關心堆,而是讓編譯器根據逃逸分析在需要時分配它。我們唯一關心的是副本本身。


您可以在godbolt上看到一個示例:


給出以下簡單代碼:


func main() {

   type Data struct{

        foo string

    }


    original := Data{"hi"}

    copy := original

    copyPtr := &copy

    fmt.Println(copyPtr)

}

Go 會自動copy在堆上分配:


        call    runtime.newobject(SB)

我們還可以通過在編譯時傳遞額外的標志來顯示轉義和內聯決策,從而看到這一點:


$ go build -gcflags '-m' .

...

./main.go:11:2: moved to heap: copy

...

注意:復制是一個內置函數。避免重復使用名稱可能是個好主意(它工作得很好,但這不是很好的做法)。


查看完整回答
反對 回復 2022-06-27
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

Golang 中的結構變量可以簡單地通過賦值語句復制到另一個:


https://play.golang.org/p/4Zcbxhy5UoB


package main


import (

    "fmt"

)


type User struct {

    name string

}


func main() {

    u1 := User{name: "foo"}

    

    u2 := u1

    u2.name = "bar"

    

    fmt.Println("u1: ", u1)

    fmt.Println("u2: ", u2)


}

輸出:


u1:  {foo}

u2:  {bar}


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號