You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:54:52