On Wed, 6 Mar 2019, Jan Beulich wrote:
> > +static inline ptrdiff_t name ## _diff(const type s1[],                     
> >    \
> > +                                      const struct abstract_ ## name s2[]) 
> >    \
> > +{                                                                          
> >    \
> > +    BUILD_BUG_ON(alignof(*s1) != alignof(*s2));                            
> >    \
> > +    return (ptrdiff_t)((uintptr_t)s2 - (uintptr_t)s1) /                    
> >    \
> > +           (ptrdiff_t)sizeof(*s1);                                         
> >     \
> > +}                                                                          
> >  
> 
> I had specifically asked for this to simply call _bytediff, to limit
> redundancy and in particular the total number of casts.
> 
> > +static inline ptrdiff_t name ## _bytediff(const type s1[],                 
> >    \
> > +                                          const struct abstract_ ## name 
> > s2[])\
> > +{                                                                          
> >    \
> > +    BUILD_BUG_ON(alignof(*s1) != alignof(*s2));                            
> >    \
> > +    return (ptrdiff_t)((uintptr_t)s2 - (uintptr_t)s1);                     
> >    \
> > +}
> 
> What's the value of the intermediate casting to uintptr_t? Why not
> cast to ptrdiff_t right away?

uintptr_t is the integer type corresponding to a pointer, so we should
use uintptr_t first. ptrdiff_t is the difference type so we should cast
to it afterwards. Specifically, uintptr_t is unsigned and ptrdiff_t is
signed. So I don't think it would be correct to do:

  return (ptrdiff_t)((ptrdiff_t)s2 - (ptrdiff_t)s1);

Or am I missing your point?


I'll address all the other comments.


> I also don't think the BUILD_BUG_ON() is helpful in this latter case.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to