https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63303

--- Comment #20 from Joshua Green <jvg1981 at aim dot com> ---
> "But if we don't know which pointer is greater, it gets more complicated:
> ..."
> 
> I'm not sure that this is true.  For types that are larger than 1 byte, it
> seems that one can do the subtraction after any division(s), hence only
> costing an additional division (or shift):
> 
>     T * p;
>     T * q;
> 
>     .
>     .
>     .
> 
>     intptr_t pVal = ((uintptr_t) p)/(sizeof *p);
>     intptr_t qVal = ((uintptr_t) q)/(sizeof *q);
> 
>     ptrdiff_t p_q = pVal - qVal;
> 
> This should work in well-defined cases, for if p and q are pointers into the
> same array then (presumably) ((uintptr_t) p) and ((uintptr_t) q) must have
> the same remainder modulo sizeof(T).
> 
> Of course, even an additional shift may be too expensive in some cases, so
> it's not entirely clear that this change should be made.

It occurred to me that such contortions can be avoided in the (possibly) common
case when (say) q is actually an array.

Reply via email to