Created
February 23, 2019 15:41
-
-
Save kohnakagawa/176ccca1ad83e4c5340814421e8def14 to your computer and use it in GitHub Desktop.
Goにおいて「構造体を参照渡しするか・値渡しするか」「戻り値を参照渡しにするか・値渡しにするか」の議論をはっきりさせるためのコード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
結論