为何3字节C++ struct的alignof值为1?
关于3字节结构体alignof值为1的疑问
我编写了一个示例来展示3字节结构体的地址对齐情况:
#include <iostream> struct Silly { char a; char b; char c; }; int main() { std::cout << "sizeof(Silly): " << sizeof(Silly) << std::endl; std::cout << "alignof(Silly): " << alignof(Silly) << std::endl; auto p_silly = new Silly[2]; std::cout << "address[0]: " << &p_silly[0] << std::endl; std::cout << "address[1]: " << &p_silly[1] << std::endl; std::cout << "stride: " << &p_silly[1] - &p_silly[0] << std::endl; delete[] p_silly; }
使用g++ -std=c++23编译后,得到如下输出:
sizeof(Silly): 3 alignof(Silly): 1 address[0]: 0x63b1ada176c0 address[1]: 0x63b1ada176c3 stride: 1
我对输出的疑惑点:
sizeof(Silly)=3是合理的,结构体包含3字节数据,所有字段都是char,处理器可从任意地址读写单字节,因此无填充。- 但
alignof(Silly)=1无法理解,我原本认为对齐值是对象可分配的连续地址间的字节数,预期该值为3。 - 两个对象地址差3字节,连续分配无填充,这符合预期。
- 后来搞清楚stride表示的是元素个数而非字节数,这点已明白。
请问为何alignof的值为1?
问题解答
首先要纠正你对alignof的误解:alignof的含义是对象的起始地址必须是该值的整数倍,而非你认为的“连续对象间的字节数”。
根据C++标准,结构体的对齐值等于其所有成员中对齐要求最高的那个值。你的Silly结构体所有成员都是char类型,而char的对齐值是1——也就是说char变量可以放在任意地址上,不需要特殊对齐。因此整个Silly结构体的对齐要求自然继承了成员的最高对齐值,也就是1。
这意味着Silly对象可以被分配到任何内存地址(因为任何地址都是1的整数倍),完全满足处理器的读写要求,所以alignof(Silly)=1是完全符合标准的结果。
再结合数组的情况来看:数组中每个元素的地址是前一个元素地址加上sizeof(Silly),这里是3字节。因为每个元素的地址都满足对齐要求(是1的整数倍),所以不需要在元素之间添加填充字节,这就是两个对象地址差3字节的原因。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

