alignof 返回类型在内存中的最小对齐字节数,是C++11引入的编译期运算符,不产生运行时代价;其值由平台ABI和编译器决定,与sizeof无关,且需配合alignas等机制确保实际地址对齐。

alignof 返回的是类型在内存中的最小对齐字节数
alignof 是 C++11 引入的编译期运算符,它不调用函数、不产生运行时代价,只在编译时计算类型 所需的最小对齐边界(单位是字节)。这个值通常由目标平台 ABI 和编译器决定,比如 x86-64 上 int 通常是 4,double 是 8,而 std::max_align_t 一般是 16(取决于是否启用 AVX 等扩展)。
注意:alignof 查的是“要求”,不是“实际占用”——它和 sizeof 没有直接换算关系;一个类型可能 sizeof 是 3,但因成员对齐约束,alignof 是 4。
基本用法:直接作用于类型名或表达式
最常用写法是 alignof(Type),也可写成 alignof(expr)(此时取表达式结果类型的对齐值):
static_assert(alignof(int) == 4, "");
static_assert(alignof(double) == 8, "");
static_assert(alignof(std::string) >= 8, ""); // 具体值依赖实现
static_assert(alignof("hello") == alignof(char), ""); // 字符串字面量类型是 const char[6]
- 必须传类型名(如
int、MyStruct)或完整表达式(如arr[0]),不能传变量名本身(alignof(x)是合法的,但取的是x的类型,不是变量地址的对齐) - 不能用于位域成员、函数类型、void 类型、引用类型(C++17 起允许引用,但结果是其所引类型的对齐)
- 对数组类型,
alignof(T[N])等于alignof(T);对类/结构体,等于其所有非静态数据成员和基类中最大的alignof值(再考虑alignas修饰)
和 alignas 配合使用时要注意对齐值必须是 2 的幂且不小于自然对齐
你用 alignas(N) 强制指定对齐时,N 必须是 2 的整数幂(1, 2, 4, 8…),且不能小于该类型原本的 alignof 值,否则编译报错:
立即学习“C++免费学习笔记(深入)”;
struct alignas(2) Small { char a; }; // OK:alignof(char)==1,2≥1
struct alignas(3) Bad { char a; }; // 错误:3 不是 2 的幂
struct alignas(1) Tiny { double d; }; // 错误:alignof(double)==8,1<8
- 编译器不会“降级”对齐——
alignas只能放大,不能缩小原始对齐要求 - 如果结构体里有
alignas(16)成员,整个结构体的alignof至少为 16,即使其他成员都很小 - 跨平台代码中,避免硬写具体数字;可优先用
alignas(std::max_align_t)或alignas(alignof(T))显式保持原有对齐
调试时别把 alignof 和实际分配地址的对齐混淆
alignof 告诉你“这个类型期望怎么放”,但栈上局部变量或堆上 new 出来的对象,其地址对齐还受分配策略影响。例如:
alignas(32) char buf[64]; std::cout << reinterpret_cast<uintptr_t>(buf) % 32 << "\n"; // 一定为 0 int x; std::cout << reinterpret_cast<uintptr_t>(&x) % alignof(int) << "\n"; // 不一定为 0!x 的地址由栈帧布局决定,未必满足 alignof(int) 的倍数(虽然绝大多数情况下会,但标准不保证)
- 只有显式用
alignas修饰的变量、或通过std::aligned_alloc/operator new带对齐参数分配的内存,才能确保地址满足对应对齐 - 检查运行时地址对齐要用
reinterpret_cast<uintptr_t>(ptr) % N == 0,而不是靠alignof推断 - 在自定义内存池或序列化场景中,
alignof是计算偏移和填充的关键输入,但最终布局还得结合offsetof和 padding 手动验证
-mavx)、打包指令(#pragma pack)、以及你是否用了 alignas 动态改变。真正用到时,最好在目标平台上实测 alignof 结果,并配合 offsetof 和 sizeof 一起看结构体内存布局。


















