Ask*_*aga 1 c string c99 string-literals
我想确保给定的字符串文字最终到达的地址是2的倍数,甚至更好的是4。
有什么方法可以做到这一点,最好不使用任何编译器特定的扩展?还是不可能?
我想这样做,因此字符串地址的最低位是0,可以用作标签位。
您可以使用C11(但不能使用C99)执行此操作。对于静态分配的缓冲区,您可以alignas执行以下操作:
#include <stdio.h>
#include <stdalign.h>
alignas(4) char str[] = "this is aligned to at least 4 bytes";
int main() {
char a;
alignas(4) char str2[] = "and again";
printf("%p\n", &a);
printf("%p\n", str);
printf("%p\n", str2);
}
Run Code Online (Sandbox Code Playgroud)
上面的技巧是,字符串文字实际上正在用于初始化相同大小的char数组,该数组可让您alignas在类型中使用。
对于动态分配的,请使用aligned_alloc(size_t alignment, size_t size)代替malloc。
还有其他一些较旧的非标准方法可以与GCC / Clang / Intel编译器一起使用,因此,如果您始终没有C11,则可以通过一些额外的预处理工作来完成,例如:
#if __STDC_VERSION__ >= 201112L
# include <stdalign.h>
# define force_align(x) alignas(x)
#elif defined __GNUC__
# define force_align(x) __attribute__((aligned(x)))
#elif defined __MSC_VER
# define force_align(x) __declspec(align(x))
#else
# error Who are you?
#endif
force_align(128) int x; // Note: maybe your linker doesn't actually support 128 anyway!
Run Code Online (Sandbox Code Playgroud)
它偏爱C11解决方案,但使用GCC特定扩展或MSVC,而没有其他合适的扩展。