gostring的內部實現

stormbm發表於2018-10-23

go string 內部實現

這個string的探索
來來個例子

func boo(a int, b int)(int, string){
    return a + b, "abcd"
}
81079 000000000044dfa0 <main.boo>:
81080   44dfa0:>------48 c7 44 24 18 00 00 >--movq   $0x0,0x18(%rsp)
81081   44dfa7:>------00 00- 
81082   44dfa9:>------0f 57 c0             >--xorps  %xmm0,%xmm0
81083   44dfac:>------0f 11 44 24 20       >--movups %xmm0,0x20(%rsp)
81084   44dfb1:>------48 8b 44 24 08       >--mov    0x8(%rsp),%rax
81085   44dfb6:>------48 03 44 24 10       >--add    0x10(%rsp),%rax
81086   44dfbb:>------48 89 44 24 18       >--mov    %rax,0x18(%rsp)
81087   44dfc0:>------48 8d 05 d4 eb 01 00 >--lea    0x1ebd4(%rip),%rax        # 46cb9b <go.string.*+0xbb>
81088   44dfc7:>------48 89 44 24 20       >--mov    %rax,0x20(%rsp)
81089   44dfcc:>------48 c7 44 24 28 04 00 >--movq   $0x4,0x28(%rsp)
81090   44dfd3:>------00 00- 
81091   44dfd5:>------c3                   >--retq---

其中

81087   44dfc0:>------48 8d 05 d4 eb 01 00 >--lea    0x1ebd4(%rip),%rax        # 46cb9b <go.string.*+0xbb>
81088   44dfc7:>------48 89 44 24 20       >--mov    %rax,0x20(%rsp)
81089   44dfcc:>------48 c7 44 24 28 04 00 >--movq   $0x4,0x28(%rsp)
81090   44dfd3:>------00 00- 
81091   44dfd5:>------c3                   >--retq---

lea 0x1ebd4(%rip),%rax得到char*, mov %rax,0x20(%rsp)複製給返回值, movq $0x4,0x28(%rsp)把長度也填進去,

其實可以看到string就是c裡面的char* 和len的組合


相關文章