• Keith Randall's avatar
    runtime,cmd/compile: pass strings and slices to convT2{E,I} by value · 0e9f8a21
    Keith Randall authored
    When we pass these types by reference, we usually have to allocate
    temporaries on the stack, initialize them, then pass their address
    to the conversion functions. It's simpler to pass these types
    directly by value.
    
    This particularly applies to conversions needed for fmt.Printf
    (to interface{} for constructing a [...]interface{}).
    
    func f(a, b, c string) {
         fmt.Printf("%s %s\n", a, b)
         fmt.Printf("%s %s\n", b, c)
    }
    
    This function's stack frame shrinks from 200 to 136 bytes, and
    its code shrinks from 535 to 453 bytes.
    
    The go binary shrinks 0.3%.
    
    Update #24286
    
    Aside: for this function f, we don't really need to allocate
    temporaries for the convT2E function. We could use the address
    of a, b, and c directly. That might get similar (or maybe better?)
    improvements. I investigated a bit, but it seemed complicated
    to do it safely. This change was much easier.
    
    Change-Id: I78cbe51b501fb41e1e324ce4203f0de56a1db82d
    Reviewed-on: https://go-review.googlesource.com/c/135377
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarJosh Bleecher Snyder <josharian@gmail.com>
    0e9f8a21
iface.go 15.6 KB