假设您在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个字节进入寄存器。
假设您想让字符串文字对齐;这是不可能的。但是通过使数组具有自定义对齐方式,您可以得到类似的效果,例如:
_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)
尽管某些编译器尚不支持此功能。
归档时间: |
|
查看次数: |
110 次 |
最近记录: |