How to 8-byte align each string in a static array?

4 c assembly gcc clang

假设您在C程序(不是C ++)中有一个静态的文字字符串数组,其长度可以相差很大。您所关心的只是每个起始于8字节边界。有没有办法确保GCC或CLANG这样对齐每个字符串?您还想节省空间,因此无法对字符串进行填充以使它们大小相同。

static char* const strings[] = {
    "a", "longer string", "bcd", "wow a really long string", "foo", ...
};
Run Code Online (Sandbox Code Playgroud)

这里的目标是执行以下操作:

uint64_t value = *(uint64_t*) strings[i];
Run Code Online (Sandbox Code Playgroud)

这样,读操作就不会跨过生成的asm代码中的两个quadwords,即,使用对齐的读操作,字符串的前8个字节进入寄存器。

M.M*_*M.M 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 };
Run Code Online (Sandbox Code Playgroud)

您可以通过为每个条目使用预处理器宏来保存类型。

另请参阅此问题


根据C17标准,您还可以将复合文字与对齐说明符一起使用:

char const *const strings[] = 
{
    (_Alignas(8) char const[]){"a"},
    (_Alignas(8) char const[]){"longer string"},
};
Run Code Online (Sandbox Code Playgroud)

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