On 01/14/2017 07:11 AM, albert-j wrote:
> Is it possible to refer to an array element by a descriptive name, just
> for code clarity, without performance overhead? E.g.
>
> void aFunction(double[] arr) {
>     double importantElement = arr[3];
>     ... use importantElement ...
> }
>
> But the above, I suppose, introduces an extra copy operation?
>

I've used nested functions before. Compiled with

  -O -inline -boundscheck=off

even dmd produces exact code for the following three access methods:

import std.stdio;

void aFunction(double[] arr) {
    ref importantElement() {
        return arr[3];
    }
    writeln("Indexed element : ", arr[3]);
    writeln("importantElement: ", importantElement);

    double originalIdea = arr[3];
    writeln("Original idea   : ", originalIdea);
}

void main() {
}

Here are the three calls; comments added by me. The only difference is RCX vs. RAX for one of the calls:

.text._D6deneme9aFunctionFAdZv  segment
        assume  CS:.text._D6deneme9aFunctionFAdZv
_D6deneme9aFunctionFAdZv:
                push    RBP
                mov     RBP,RSP
                sub     RSP,010h
                mov     -010h[RBP],RDI
                mov     -8[RBP],RSI

; arr[3]
                mov     EDX,offset FLAT:_TMP0@32
                mov     EDI,012h
                mov     RSI,RDX
                mov     RAX,-8[RBP]
                movsd   XMM0,018h[RAX]
                call      _D3std5stdio18__T7writelnTAyaTdZ7writelnFNfAyadZv@PC32

; importantElement:
                mov     EDX,offset FLAT:_TMP0@32
                mov     EDI,012h
                mov     RSI,RDX
                mov     RCX,-8[RBP]
                movsd   XMM0,018h[RCX]
                call      _D3std5stdio18__T7writelnTAyaTdZ7writelnFNfAyadZv@PC32

; originalIdea:
                mov     EDX,offset FLAT:_TMP0@32
                mov     EDI,012h
                mov     RSI,RDX
                mov     RAX,-8[RBP]
                movsd   XMM0,018h[RAX]
                call      _D3std5stdio18__T7writelnTAyaTdZ7writelnFNfAyadZv@PC32


                mov     RSP,RBP
                pop     RBP
                ret
                0f1f
                add     byte ptr [RAX],0
                add     [RAX],AL
.text._D6deneme9aFunctionFAdZv  ends

Ali

Reply via email to