C(和C++)中字符的对齐方式是否保证为 1
Is the alignment of char in C (and C++) guaranteed to be 1?
alignof(char)
可以是 1 以外的任何东西吗?
来自非官方 cppreference.com 维基:
最弱(最小)的对齐是类型
char
、signed char
和unsigned char
的对齐,通常为1。
"通常"似乎暗示它可能是别的东西。
C 标准对char
对齐的唯一规定是(C11 N1570 6.2.8 第 1 段):
可以使用
_Alignof
表达式查询完整类型的对齐要求。char
、signed char
和unsigned 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 char
或signed 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,但这不是硬性要求。
- 不同/较旧的处理器运行c++代码的方式是否不同
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 这种方式是否可以接受向向量添加unique_ptr?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 我们是否应该转向新的自我分配保护方式?
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- clang++ 是否以更轻松的方式处理系统标头?
- size_t的大小和对齐方式是否与ptrdiff_t相同?
- 是否可以以编程方式构造 std::initializer_list?
- 是否有任何优雅的方式来遍历元素位置可以更改的列表?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 是否可以在C++中以间接方式包含头文件
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我是否以错误的方式声明了getpriorityvalues函数
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?