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