如何以8字节对齐静态数组中的每个字符串?

时间:2019-06-04 05:23:08

标签: c gcc assembly clang

想象一下,您在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个字节放入寄存器中。

1 个答案:

答案 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"},
};

尽管某些编译器尚不支持此功能。