On 9/17/18 3:39 PM, Nir Soffer wrote:
> +#define IS_ALIGNED(size, align) ({ \
> + assert (is_power_of_2 ((align))); \
> + !((size) & ((align) - 1)); \
> +})
>
But this version will happily accept singed int, and I think this code
behavior with signed int is undefined.
Well, sort of. Bit shifts are very likely to hit undefined behavior on
ints. But & and | are not shifts.
See
https://wiki.sei.cmu.edu/confluence/display/c/INT13-C.+Use+bitwise+operat...
Why use a macro when we can use a function that is likely to be inlined
anyway?
This is not used in tight loops, so there is no reason to use a macro.
If you want to use a macro, see the kernel align macros:
Alas, the kernel has a more restrictive license (GPLv2 in general);
which means we can't copy it into nbdkit. (True, the definitions will
look similar, but if we claim we copied from somewhere, that source had
better be permissively licensed).
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization:
qemu.org |
libvirt.org