Is implicit string literal concatenation a good thing?
BCS
none at anon.com
Sun Feb 22 19:48:17 PST 2009
Hello bearophile,
> If there are guarantees that "abc" "def" are folded at compile time,
> then the same guarantees can be specified for "abc" ~ "def". I can't
> see a problem.
While it is not part of the spec, I do see a problem. If it were added....
>
> I have also compiled this code with DMD:
>
> void main() {
> string foo = "foo";
> string bar = foo ~ "bar" ~ "baz";
> }
> Resulting asm, no optimizations:
>
> L0: push EBP
> mov EBP,ESP
> mov EDX,FLAT:_DATA[0Ch]
> mov EAX,FLAT:_DATA[08h]
> push dword ptr FLAT:_DATA[01Ch]
> push dword ptr FLAT:_DATA[018h]
> push dword ptr FLAT:_DATA[02Ch]
> push dword ptr FLAT:_DATA[028h]
note 6 things
> push EDX
> push EAX
> push 3
> mov ECX,offset FLAT:_D11TypeInfo_Aa6__initZ
> push ECX
> call near ptr __d_arraycatnT
> xor EAX,EAX
> add ESP,020h
> pop EBP
> ret
> Resulting asm, with optimizations:
>
> L0: sub ESP,0Ch
> mov EAX,offset FLAT:_D11TypeInfo_Aa6__initZ
> push dword ptr FLAT:_DATA[01Ch]
> push dword ptr FLAT:_DATA[018h]
> push dword ptr FLAT:_DATA[02Ch]
> push dword ptr FLAT:_DATA[028h]
> push dword ptr FLAT:_DATA[0Ch]
> push dword ptr FLAT:_DATA[08h]
again 6 things
> push 3
I think that is a varargs call
> push EAX
> call near ptr __d_arraycatnT
> add ESP,020h
> add ESP,0Ch
> xor EAX,EAX
> ret
> I can see just one arraycatn, so the two string literals are folded at
> compile time, I think.
>
> Bye,
> bearophile
I think that DMD does some optimization for a~b~c etc. so that there is only
one call for any number of chained ~ (array cat n). In this case I think
it is doing that.
More information about the Digitalmars-d
mailing list