如何将字符串文字与4的倍数对齐?

Ask*_*aga 1 c string c99 string-literals

我想确保给定的字符串文字最终到达的地址是2的倍数,甚至更好的是4。

有什么方法可以做到这一点,最好不使用任何编译器特定的扩展?还是不可能?

我想这样做,因此字符串地址的最低位是0,可以用作标签位。

Fle*_*exo 5

您可以使用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,而没有其他合适的扩展