第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有沒(méi)有一種慣用的方法來(lái) malloc 和 memcpy 結(jié)構(gòu)?

有沒(méi)有一種慣用的方法來(lái) malloc 和 memcpy 結(jié)構(gòu)?

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

2 回答

?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

慣用的方法是做一個(gè)簡(jiǎn)單的賦值,讓編譯器copy在執(zhí)行逃逸分析后在堆上分配:


original := Data{...}

copy := original

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

在注意到它c(diǎn)opy被引用使用并且超過(guò)堆棧時(shí),Go 將自動(dòng)在堆上而不是在堆棧上分配它(當(dāng)然,復(fù)制仍然正確完成)


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


您可以在godbolt上看到一個(gè)示例:


給出以下簡(jiǎn)單代碼:


func main() {

   type Data struct{

        foo string

    }


    original := Data{"hi"}

    copy := original

    copyPtr := &copy

    fmt.Println(copyPtr)

}

Go 會(huì)自動(dòng)copy在堆上分配:


        call    runtime.newobject(SB)

我們還可以通過(guò)在編譯時(shí)傳遞額外的標(biāo)志來(lái)顯示轉(zhuǎn)義和內(nèi)聯(lián)決策,從而看到這一點(diǎn):


$ go build -gcflags '-m' .

...

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

...

注意:復(fù)制是一個(gè)內(nèi)置函數(shù)。避免重復(fù)使用名稱(chēng)可能是個(gè)好主意(它工作得很好,但這不是很好的做法)。


查看完整回答
反對(duì) 回復(fù) 2022-06-27
?
尚方寶劍之說(shuō)

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

Golang 中的結(jié)構(gòu)變量可以簡(jiǎn)單地通過(guò)賦值語(yǔ)句復(fù)制到另一個(gè):


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}


查看完整回答
反對(duì) 回復(fù) 2022-06-27
  • 2 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)