C(和C++)中字符的对齐方式是否保证为 1

Is the alignment of char in C (and C++) guaranteed to be 1?

本文关键字:是否 方式 对齐 C++ 字符      更新时间:2023-10-16

alignof(char)可以是 1 以外的任何东西吗?

来自非官方 cppreference.com 维基:

最弱(最小)的对齐是类型charsigned charunsigned char的对齐,通常为1。

"通常"似乎暗示它可能是别的东西。

C 标准对char对齐的唯一规定是(C11 N1570 6.2.8 第 1 段):

可以使用_Alignof表达式查询完整类型的对齐要求。charsigned charunsigned char的类型应具有最弱的对齐要求。

但是,请考虑对齐的定义(C11 N1570 6.2.8 第 1 段,以及 C++11) 的类似定义:

对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。

由此,我认为1 char的对齐方式没有任何意义,因为要求sizeof(char) ≡ 1,这意味着相邻char元素之间的距离只能是1字节。

这有意义吗?

是的。虽然这个说法在标准中没有明确规定,但我想可以从中推断出来:

N1570 6.5.3.4 运算符的大小和_Alignof

4 当sizeof应用于具有 type char 的操作数时, unsigned charsigned char (或其限定版本) 结果是 1 .当应用于具有数组类型的操作数时, 结果是数组中的总字节数。

char为例。假设我们有char charArr[2];. sizeof charArr保证是2的,sizeof charArr[0] = sizeof charArr[1] = 1 。这意味着两个相邻的char对象取代了 2 个字节。

因此,可以推断"可以分配字符的连续地址之间的字节数"至少为 1 。此外,char的对齐方式必须是正整数,因此它不能是 1 以外的任何数字。

我不是语言律师,但如果我们看一下 C 的第 6.5.3.4 节第 3 段:

当应用于具有类型字符、无符号字符或有符号字符的操作数时, (或其限定版本)结果为 1。

对我来说,这似乎并不要求char的大小必须为 1,只是操作数的结果sizeof必须返回 1。对齐也与大小不同。对齐是由 ABI 决定的,而不是 C 或 C++ 标准。当然,确实char在 x86、x86_64 等上对齐是 1,但这不是硬性要求。

相关文章: