Print

Print


Van Snyder wrote:
> 
> People have observed that
> 
>   A(:) = B(:)
> 
> sometimes creates a temp before doing the assignment, and is therefore
> slow, and may cause a stack overflow.
> 
> Does this happen with contemporary compilers, or just old ones?

You are probably refering to Peter Shenkin's realloc example yesterday, in which
he had

>      p2( 1:nalloc ) = p( 1:nalloc ) !******** SEGV here ***************

and discovered the SEGV was due to the creation of a temp.

In his example, p and p2 are both pointers.  My guess is that a compiler cannot
avoid a temp in this situation without a lot of compilicated dependency analysis.
Suppose p2 => a(2:n) and p => a(1:n-1).  The obvious translation of the array
statement to a DO loop does not give the expected results.  Granted, in the case
that Peter gave, where p2 was allocated a couple statements before this assignment,
the compiler could easily have determined that there was no dependency.  So I'd agree
with Peter that this is really a QofI issue.  It's a matter of how many special cases
the compiler wants to look for during optimization.

I took this example to be an example of a situation where you pay a performance
penalty to use pointers.

Bill
-- 
William F. Mitchell
Mathematical and Computational Sciences Division
National Institute of Standards and Technology
[log in to unmask]     http://math.nist.gov/~mitchell


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%