C++中alignas(64)对齐的结构体为何比手动填充对齐性能更低?
核心原因
两个结构体的对齐要求(alignof结果)不同,导致内存分配、释放路径的开销有显著差异,你只验证了二者占用内存大小相同,没有注意到对齐属性的差异。
具体差异说明
- 手动填充的
node1:仅在结构体尾部补了字节保证总大小为64字节,没有改变结构体本身的对齐要求,alignof(node1)和64位系统下的指针对齐要求一致,为8字节,属于符合默认最大对齐要求的普通类型。 - 用
alignas(64)声明的node2:对齐要求被显式指定为64字节,属于C++标准定义的过度对齐类型(over-aligned type),对齐要求超过了系统默认的max_align_t阈值(64位Linux下为16字节)。
分配开销差异来源
C++17标准要求new运算符自动适配过度对齐类型的分配需求:
- 分配
node1时调用普通的operator new,底层走glibc ptmalloc的常规分配路径,对于64字节这类小内存块,ptmalloc有专门的快速缓存机制,不需要做额外的地址调整,分配/释放开销极低。 - 分配
node2时需要调用支持对齐要求的特殊分配路径,底层走aligned_alloc类的接口:为了保证返回的内存地址严格对齐到64字节边界,分配器需要做额外的地址范围检查、多余空间裁剪、对齐元数据存储等操作,分配和释放的开销都远高于常规malloc。
测试场景放大了差异
你的基准测试逻辑中,每轮迭代的主要开销就是new和delete操作,锁操作的占比非常低,因此分配路径的开销差异直接体现在了最终的性能数据上。
验证方法
你可以在代码中加入以下静态断言确认对齐属性的差异:
static_assert(alignof(node1) == alignof(void*)); static_assert(alignof(node2) == 64);
如果要排除分配器的影响,改用内存池+placement new的方式分配节点,二者的性能会基本一致。
内容的提问来源于stack exchange,提问作者george_ptr
相关产品推荐
相关产品推荐

