Skip to content

Instantly share code, notes, and snippets.

@kohnakagawa
Created February 23, 2019 15:41
Show Gist options
  • Save kohnakagawa/176ccca1ad83e4c5340814421e8def14 to your computer and use it in GitHub Desktop.
Save kohnakagawa/176ccca1ad83e4c5340814421e8def14 to your computer and use it in GitHub Desktop.
Goにおいて「構造体を参照渡しするか・値渡しするか」「戻り値を参照渡しにするか・値渡しにするか」の議論をはっきりさせるためのコード
00000000010922e0 <main.norm2AsRef>:
10922e0: 48 8b 44 24 08 mov rax,QWORD PTR [rsp+0x8]
10922e5: f2 0f 10 00 movsd xmm0,QWORD PTR [rax]
10922e9: f2 0f 10 48 08 movsd xmm1,QWORD PTR [rax+0x8]
10922ee: f2 0f 10 50 10 movsd xmm2,QWORD PTR [rax+0x10]
10922f3: f2 0f 59 c0 mulsd xmm0,xmm0
10922f7: f2 0f 59 c9 mulsd xmm1,xmm1
10922fb: f2 0f 58 c1 addsd xmm0,xmm1
10922ff: f2 0f 59 d2 mulsd xmm2,xmm2
1092303: f2 0f 58 c2 addsd xmm0,xmm2
1092307: f2 0f 11 44 24 10 movsd QWORD PTR [rsp+0x10],xmm0
109230d: c3 ret
109230e: cc int3
109230f: cc int3
0000000001092310 <main.norm2AsVal>:
1092310: f2 0f 10 44 24 08 movsd xmm0,QWORD PTR [rsp+0x8]
1092316: f2 0f 59 c0 mulsd xmm0,xmm0
109231a: f2 0f 10 4c 24 10 movsd xmm1,QWORD PTR [rsp+0x10]
1092320: f2 0f 59 c9 mulsd xmm1,xmm1
1092324: f2 0f 58 c1 addsd xmm0,xmm1
1092328: f2 0f 10 4c 24 18 movsd xmm1,QWORD PTR [rsp+0x18]
109232e: f2 0f 59 c9 mulsd xmm1,xmm1
1092332: f2 0f 58 c1 addsd xmm0,xmm1
1092336: f2 0f 11 44 24 20 movsd QWORD PTR [rsp+0x20],xmm0
109233c: c3 ret
109233d: cc int3
109233e: cc int3
109233f: cc int3
0000000001092340 <main.norm2AsVal2>:
1092340: f2 0f 10 44 24 08 movsd xmm0,QWORD PTR [rsp+0x8]
1092346: f2 0f 10 4c 24 10 movsd xmm1,QWORD PTR [rsp+0x10]
109234c: f2 0f 10 54 24 18 movsd xmm2,QWORD PTR [rsp+0x18]
1092352: f2 0f 10 5c 24 68 movsd xmm3,QWORD PTR [rsp+0x68]
1092358: f2 0f 10 64 24 70 movsd xmm4,QWORD PTR [rsp+0x70]
109235e: f2 0f 10 6c 24 78 movsd xmm5,QWORD PTR [rsp+0x78]
1092364: f2 0f 59 c0 mulsd xmm0,xmm0
1092368: f2 0f 59 c9 mulsd xmm1,xmm1
109236c: f2 0f 58 c1 addsd xmm0,xmm1
1092370: f2 0f 59 d2 mulsd xmm2,xmm2
1092374: f2 0f 58 d0 addsd xmm2,xmm0
1092378: f2 0f 59 db mulsd xmm3,xmm3
109237c: f2 0f 58 da addsd xmm3,xmm2
1092380: f2 0f 59 e4 mulsd xmm4,xmm4
1092384: f2 0f 58 e3 addsd xmm4,xmm3
1092388: f2 0f 59 ed mulsd xmm5,xmm5
109238c: f2 0f 58 ec addsd xmm5,xmm4
1092390: f2 0f 11 ac 24 80 00 movsd QWORD PTR [rsp+0x80],xmm5
1092397: 00 00
1092399: c3 ret
109239a: cc int3
109239b: cc int3
109239c: cc int3
109239d: cc int3
109239e: cc int3
109239f: cc int3
00000000010923a0 <main.mulAsRef>:
10923a0: 65 48 8b 0c 25 30 00 mov rcx,QWORD PTR gs:0x30
10923a7: 00 00
10923a9: 48 3b 61 10 cmp rsp,QWORD PTR [rcx+0x10]
10923ad: 76 66 jbe 1092415 <main.mulAsRef+0x75>
10923af: 48 83 ec 18 sub rsp,0x18
10923b3: 48 89 6c 24 10 mov QWORD PTR [rsp+0x10],rbp
10923b8: 48 8d 6c 24 10 lea rbp,[rsp+0x10]
10923bd: 48 8d 05 3c 10 02 00 lea rax,[rip+0x2103c] # 10b3400 <runtime.rodata+0x203c0>
10923c4: 48 89 04 24 mov QWORD PTR [rsp],rax
10923c8: e8 d3 8b f7 ff call 100afa0 <runtime.newobject>
10923cd: 48 8b 44 24 20 mov rax,QWORD PTR [rsp+0x20]
10923d2: f2 0f 10 00 movsd xmm0,QWORD PTR [rax]
10923d6: 48 8b 4c 24 28 mov rcx,QWORD PTR [rsp+0x28]
10923db: f2 0f 59 01 mulsd xmm0,QWORD PTR [rcx]
10923df: 48 8b 54 24 08 mov rdx,QWORD PTR [rsp+0x8]
10923e4: f2 0f 11 02 movsd QWORD PTR [rdx],xmm0
10923e8: f2 0f 10 40 08 movsd xmm0,QWORD PTR [rax+0x8]
10923ed: f2 0f 59 41 08 mulsd xmm0,QWORD PTR [rcx+0x8]
10923f2: f2 0f 11 42 08 movsd QWORD PTR [rdx+0x8],xmm0
10923f7: f2 0f 10 41 10 movsd xmm0,QWORD PTR [rcx+0x10]
10923fc: f2 0f 59 40 10 mulsd xmm0,QWORD PTR [rax+0x10]
1092401: f2 0f 11 42 10 movsd QWORD PTR [rdx+0x10],xmm0
1092406: 48 89 54 24 30 mov QWORD PTR [rsp+0x30],rdx
109240b: 48 8b 6c 24 10 mov rbp,QWORD PTR [rsp+0x10]
1092410: 48 83 c4 18 add rsp,0x18
1092414: c3 ret
1092415: e8 c6 cb fb ff call 104efe0 <runtime.morestack_noctxt>
109241a: eb 84 jmp 10923a0 <main.mulAsRef>
109241c: cc int3
109241d: cc int3
109241e: cc int3
109241f: cc int3
0000000001092420 <main.mulAsVal>:
1092420: f2 0f 10 44 24 08 movsd xmm0,QWORD PTR [rsp+0x8]
1092426: f2 0f 10 4c 24 20 movsd xmm1,QWORD PTR [rsp+0x20]
109242c: f2 0f 59 c1 mulsd xmm0,xmm1
1092430: f2 0f 11 44 24 38 movsd QWORD PTR [rsp+0x38],xmm0
1092436: f2 0f 10 44 24 28 movsd xmm0,QWORD PTR [rsp+0x28]
109243c: f2 0f 10 4c 24 10 movsd xmm1,QWORD PTR [rsp+0x10]
1092442: f2 0f 59 c1 mulsd xmm0,xmm1
1092446: f2 0f 11 44 24 40 movsd QWORD PTR [rsp+0x40],xmm0
109244c: f2 0f 10 44 24 30 movsd xmm0,QWORD PTR [rsp+0x30]
1092452: f2 0f 10 4c 24 18 movsd xmm1,QWORD PTR [rsp+0x18]
1092458: f2 0f 59 c1 mulsd xmm0,xmm1
109245c: f2 0f 11 44 24 48 movsd QWORD PTR [rsp+0x48],xmm0
1092462: c3 ret
1092463: cc int3
1092464: cc int3
1092465: cc int3
1092466: cc int3
1092467: cc int3
1092468: cc int3
1092469: cc int3
109246a: cc int3
109246b: cc int3
109246c: cc int3
109246d: cc int3
109246e: cc int3
109246f: cc int3
package main
import (
"fmt"
"math/rand"
)
type F64vec3 struct {
x float64
y float64
z float64
}
type F64vec15 struct {
v0 F64vec3
v1 F64vec3
v2 F64vec3
v3 F64vec3
v4 F64vec3
}
//go:noinline
func norm2AsRef(v *F64vec3) float64 {
return v.x*v.x + v.y*v.y + v.z*v.z
}
//go:noinline
func norm2AsVal(v F64vec3) float64 {
return v.x*v.x + v.y*v.y + v.z*v.z
}
//go:noinline
func norm2AsVal2(v F64vec15) float64 {
return v.v0.x*v.v0.x + v.v0.y*v.v0.y + v.v0.z*v.v0.z +
v.v4.x*v.v4.x + v.v4.y*v.v4.y + v.v4.z*v.v4.z
// v.v2.x*v.v2.x + v.v2.y*v.v2.y + v.v2.z*v.v2.z +
// v.v3.x*v.v3.x + v.v3.y*v.v3.y + v.v3.z*v.v3.z +
// v.v4.x*v.v4.x + v.v4.y*v.v4.y + v.v4.z*v.v4.z
}
//go:noinline
func mulAsRef(v0 *F64vec3, v1 *F64vec3) *F64vec3 {
return &F64vec3{
v0.x * v1.x,
v0.y * v1.y,
v0.z * v1.z,
}
}
//go:noinline
func mulAsVal(v0 F64vec3, v1 F64vec3) F64vec3 {
return F64vec3{
v0.x * v1.x,
v0.y * v1.y,
v0.z * v1.z,
}
}
func main() {
r := rand.New(rand.NewSource(100))
v0 := F64vec3{
x: r.Float64(),
y: r.Float64(),
z: r.Float64(),
}
v1 := F64vec3{
x: r.Float64(),
y: r.Float64(),
z: r.Float64(),
}
n0 := norm2AsRef(&v0)
n1 := norm2AsVal(v0)
fmt.Println(n0, n1)
v2 := mulAsRef(&v0, &v1)
v3 := mulAsVal(v0, v1)
fmt.Println(v2)
fmt.Println(v3)
vn4 := F64vec15{
v0,
v1,
*v2,
v3,
v3,
}
n2 := norm2AsVal2(vn4)
fmt.Println(n2)
}
@kohnakagawa
Copy link
Author

結論

  • 構造体の中身を書き換える以外の用途では、基本値渡しで良さそう
  • 戻り値については値渡しが良い

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment