www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.announce - Re: ldc 0.9.1 released

reply bearophile <bearophileHUGS lycos.com> writes:
While this code:

    typedef int Int2 = 2;
    auto a = cast(int[])(new Int2[1000]);
    
Produces:

	pushl	%esi
	subl	$8, %esp
	movl	$1000, 4(%esp)
	movl	$_D20TypeInfo_ATmain4Int26__initZ, (%esp)
	xorl	%esi, %esi
	call	_d_newarrayiT
	movl	%esi, %ecx
	
(I haven't taken the running time, so I don't know if this idiom is more
efficient with LDC).

Bye,
bearophile
May 27 2009
parent Frits van Bommel <fvbommel REMwOVExCAPSs.nl> writes:
bearophile wrote:
 While this code:
 
     typedef int Int2 = 2;
     auto a = cast(int[])(new Int2[1000]);
     
 Produces:
 
 	pushl	%esi
 	subl	$8, %esp
 	movl	$1000, 4(%esp)
 	movl	$_D20TypeInfo_ATmain4Int26__initZ, (%esp)
 	xorl	%esi, %esi
 	call	_d_newarrayiT
 	movl	%esi, %ecx
 	
 (I haven't taken the running time, so I don't know if this idiom is more
efficient with LDC).

For arrays that escape, it's quite probably more efficient since it only gets initialized once this way. For arrays that can get stack-promoted it may not be, because (non zero-)initialized arrays aren't eligible for that yet (as you can tell by the _d_newarray* call, which GC-allocates a new array and initializes it). So which is more efficient in that case depends on whether a GC allocation is more expensive than re-initializing 4 KB of data.
May 27 2009