我想确保给定的字符串文字最终为地址的2倍,甚至更好,4。
有没有办法实现这一点,最好不使用任何特定于编译器的扩展?或者这是不可能的?
我想这样做,所以字符串地址的最低位是0,可以(ab)用作标记位。
答案 0 :(得分:3)
您可以使用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);
}
上面的技巧是字符串文字实际上用于初始化相同大小的char数组,这允许你在类型中使用alignas
。
对于动态分配的,您使用aligned_alloc(size_t alignment, size_t size)
代替malloc
。
(还有其他一些较旧的非标准方法可以与GCC / Clang /英特尔编译器一起使用,也可以在某种程度上回归)
答案 1 :(得分:0)
在C99中,您可以使用联合执行此操作,例如
#define ALIGNED_STR_UNION(N, S) const union { char s[sizeof S]; int align; } N = { S }
ALIGNED_STR_UNION(sssu, "XYZABC");
根据需要调整类型int
。
有了这个,sssu.s
指的是人物。
可以像
一样避免使用.s
#define ALIGNED_STR(S) ((const union { char s[sizeof S]; int align; }){ S }.s)
const char *sss = ALIGNED_STR("XYZABC");
但是,这个版本浪费了指针上的空间(包括位置无关代码的相对重定位),并且不允许在函数中声明静态文字。
最好使用非标准对齐属性而不是此。