想象一下,您在C程序(不是C ++)中有一个静态的文字字符串数组,其长度可以相差很大。您所关心的只是每个起始于8字节边界。有没有办法确保GCC或CLANG这样对齐每个字符串? 您还想节省空间,因此请不要将字符串填充为全部相同的大小。
static char* const strings[] = {
"a", "longer string", "bcd", "wow a really long string", "foo", ...
};
此处的目标是执行以下操作:
uint64_t value = *(uint64_t*) strings[i];
使得读操作不会跨越生成的asm代码中的两个quadwords,即,使用对齐的读操作将字符串的前8个字节放入寄存器中。
答案 0 :(得分:7)
假设您要使字符串文字对齐;这是不可能的。但是通过使用自定义对齐方式创建数组,您可以获得类似的效果,例如:
_Alignas(8) static char const s1[] = {"a"};
_Alignas(8) static char const s2[] = {"longer string"};
_Alignas(8) static char const s3[] = {"bcd"};
_Alignas(8) static char const s4[] = {"wow a really long string"};
_Alignas(8) static char const s5[] = {"foo"};
char const *const strings[] = { s1, s2, s3, s4, s5 };
您可以通过为每个条目使用预处理器宏来保存键入内容。
另请参阅this question。
根据C17标准,您还可以将复合文字与对齐说明符一起使用:
char const *const strings[] =
{
(_Alignas(8) char const[]){"a"},
(_Alignas(8) char const[]){"longer string"},
};
尽管某些编译器尚不支持此功能。