【问题标题】:How to 8-byte align each string in a static array?如何8字节对齐静态数组中的每个字符串?
【发布时间】:2019-10-19 14:58:01
【问题描述】:

假设您在 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 代码中的两个四字,即字符串的前 8 个字节使用对齐读取进入寄存器。

【问题讨论】:

  • 您可以使用具有 8 字节对齐要求的联合类型。但首先问问自己:为什么你首先需要这个?这很可能是个坏主意。
  • 我向你保证,这对我来说是一个非常好的主意。
  • 这是一个指针数组,而不是字符串数组。请澄清你的意思是哪一个。 (如果你的意思是指针数组,你希望指针地址对齐,还是字符串文字地址对齐?)
  • 使用 Clang 我发现 @aaaaaa123456789 的答案不会产生字符串对齐的汇编语言。
  • uint64_t value = *(uint64_t*) strings[i]; 在 C 中仍然是未定义的行为,因为它违反了严格的别名。你想要memcpy(value, strings[i], sizeof(value));,它将在支持未对齐负载的平台上内联。如果您可以将对齐信息传达给编译器(例如,通过具有指向 aligned 字符串或联合的指针数组),那么即使在 MIPS64 或任何不允许正常加载的平台上,它也应该内联不对齐。

标签: c gcc assembly clang


【解决方案1】:

假设您的意思是要对齐字符串文字;这不可能。但是您可以通过使用自定义对齐方式制作数组来获得类似的效果,例如:

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

虽然有些编译器还不支持这个。

【讨论】:

  • 为避免创建所有这些外部变量,也可以将 sX 变量设为 static 或仅使用复合文字。
  • 在 Mac 上使用 Clang 我检查了汇编语言 (gcc -S),您的解决方案确实有效。它产生例如: .p2align 3 _s1: .asciz "a"
  • @JensGustedt 复合文字不允许 alignment-specifier 根据标准。同意static
  • @M.M 这是规范中的错误,已在 C17 中更正。它现在说:对齐说明符只能出现在声明的声明说明符中,或出现在成员声明的说明符限定符列表中,或复合文字的类型名称中。
  • @denk,我不明白有什么不好的,这里,这是 C17 的改进,不是吗?对于 C 的未来,单独提出建议也无济于事。必须有人来做这项工作。因此,请加入您所在国家的国家标准机构,并参加 WG14。我们需要大家齐心协力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多