Multiple return values...
Mantis
mail.mantis.88 at gmail.com
Sat Mar 10 18:08:50 PST 2012
11.03.2012 3:45, Robert Jacques пишет:
> [...]
> Manu, please go read the D ABI (http://dlang.org/abi.html). Remember,
> your example of returning two values using Tuple vs 'real' MRV? The D
> ABI states that those values will be returned via registers. Returning
> something larger? Then the NVRO kicks in which gives you a zero copy
> approach. On x86-64 these limits are different, since you have more
> registers to play with, but the concept is the same. In fact,
> returning arguments has always been more efficient than passing
> arguments.
>
It doesn't work with FPU stack however, so returning these packed into
structure should be slower that via ref parameters. E.g:
Tuple!(float, float) callee() {
do something to achieve result in st0,st1
fst st0, st1 into stack
load stack values into EAX, EDX
ret
}
void caller() {
call callee()
push EAX, EDX into a stack
fld stack values into st0, st1
do something with st0, st1
}
As opposed to:
Tuple!(float, float) callee() {
do something to achieve result in st0,st1
ret
}
void caller() {
call callee()
do something with st0, st1
}
Is there something I miss here?
More information about the Digitalmars-d
mailing list