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

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

Go 內(nèi)存分配 - 新對(duì)象、指針和轉(zhuǎn)義分析

Go 內(nèi)存分配 - 新對(duì)象、指針和轉(zhuǎn)義分析

Go
慕尼黑8549860 2022-09-05 15:31:26
我讀到Golang語(yǔ)言以一種聰明的方式管理內(nèi)存。使用轉(zhuǎn)義分析,go 在調(diào)用 new 時(shí)可能不會(huì)分配內(nèi)存,反之亦然。golang可以用這樣的符號(hào)分配內(nèi)存嗎 ?或者指針始終指向堆棧var bob * Person = & Person {2, 3}
查看完整描述

3 回答

?
慕妹3146593

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

指針可能會(huì)轉(zhuǎn)義到堆中,也可能不轉(zhuǎn)義,具體取決于您的使用案例。編譯器非常智能。例如,給定:


type Person struct {

    b, c int

}



func foo(b, c int) int {

    bob := &Person{b, c}

    return bob.b

}

該函數(shù)將編譯為:foo


    TEXT    "".foo(SB)

    MOVQ    "".b+8(SP), AX

    MOVQ    AX, "".~r2+24(SP)

    RET

它全部位于此處的堆棧上,因?yàn)榧词顾侵羔?,它也不?huì)逃脫此函數(shù)的作用域。bob


但是,如果我們考慮輕微的(盡管是人為的)修改:


var globalBob *Person


func foo(b, c int) int {

    bob := &Person{b, c}

    globalBob = bob

    return bob.b

}

然后轉(zhuǎn)義,并將編譯為:bobfoo


    TEXT    "".foo(SB), ABIInternal, $24-24

    MOVQ    (TLS), CX

    CMPQ    SP, 16(CX)

    PCDATA  $0, $-2

    JLS     foo_pc115

    PCDATA  $0, $-1

    SUBQ    $24, SP

    MOVQ    BP, 16(SP)

    LEAQ    16(SP), BP

    LEAQ    type."".Person(SB), AX

    MOVQ    AX, (SP)

    PCDATA  $1, $0

    CALL    runtime.newobject(SB)

    MOVQ    8(SP), AX

    MOVQ    "".b+32(SP), CX

    MOVQ    CX, (AX)

    MOVQ    "".c+40(SP), CX

    MOVQ    CX, 8(AX)

    PCDATA  $0, $-2

    CMPL    runtime.writeBarrier(SB), $0

    JNE     foo_pc101

    MOVQ    AX, "".globalBob(SB)

 foo_pc83:

    PCDATA  $0, $-1

    MOVQ    (AX), AX

    MOVQ    AX, "".~r2+48(SP)

    MOVQ    16(SP), BP

    ADDQ    $24, SP

    RET

如您所見(jiàn),它調(diào)用 .newobject


這些反匯編列表由 https://godbolt.org/ 生成,在 amd64 上為 go 1.16 生成


查看完整回答
反對(duì) 回復(fù) 2022-09-05
?
江戶川亂折騰

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

是將內(nèi)存分配給堆棧上還是“轉(zhuǎn)義”到堆中,完全取決于您如何使用內(nèi)存,而不是如何聲明變量。

如果返回指向堆棧分配變量的指針(例如 C),則當(dāng)您嘗試使用它時(shí),指針的值將無(wú)效。這在 Go 中是不可能的,因?yàn)槟鸁o(wú)法顯式告訴 Go 將變量放置在何處。它在選擇正確的位置方面做得很好,如果它看到對(duì)內(nèi)存 blob 的引用可能位于堆棧幀之外,它將確保在堆上進(jìn)行分配。

golang可以用這樣的符號(hào)分配內(nèi)存嗎?

var bob * Person = & Person {2, 3}

或者指針始終指向堆棧

不能說(shuō)這行代碼“總是”指向堆棧,但它有時(shí)可能會(huì),所以是的,它可能會(huì)分配內(nèi)存(在堆上)。

同樣,這不是關(guān)于那行代碼,而是關(guān)于它之后會(huì)發(fā)生什么。如果返回值 (對(duì)象的地址),則無(wú)法在堆棧上分配它,因?yàn)榉祷氐牡刂穼⒅赶蚧厥盏膬?nèi)存。bobPerson


查看完整回答
反對(duì) 回復(fù) 2022-09-05
?
守著一只汪

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

簡(jiǎn)而言之,如果編譯器可以證明該值可以在堆棧上安全地創(chuàng)建,那么它將(可能)在堆棧上創(chuàng)建。否則,它將在堆上分配。

編譯器必須執(zhí)行這些證明的工具非常好,但它并不總是正確。然而,大多數(shù)時(shí)候,擔(dān)心它的成本與收益并沒(méi)有真正的好處。


查看完整回答
反對(duì) 回復(fù) 2022-09-05
  • 3 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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