具有对齐存储的动态内存分配

Dynamic memory allocation with aligned storage

本文关键字:动态 内存 分配 存储 对齐      更新时间:2023-10-16

我对使用std::aligned_storage和需要动态分配时的对齐要求有点困惑。例:

using storage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
storage* pool;
pool = ::new storage[num_obj];

合法吗?新运算符不返回对齐记忆,那么结果是否正确?

C++11 标准要求分配函数(如::operator new返回与alignof(std::max_align_t)[basic.stc.dynamic/2] 对齐的内存:

返回的指针应适当对齐,以便可以转换为具有基本对齐要求的任何完整对象类型的指针 [...]

因此,只要您通过new表达式创建的对象的类型不是过度对齐的类型(需要比alignof(std::max_align_t)更严格的对齐方式(,一切都很好。对于过度对齐的类型,您确实必须分配足够大小的存储空间来手动对齐指针,例如,使用std::align,然后在合适的地址构造对象,例如,通过放置 new...

从 C++17 开始,new会自动处理此问题。要分配需要比__STDCPP_­DEFAULT_­NEW_­ALIGNMENT__更严格的对齐的存储(分配函数至少需要提供的对齐(,new-expression将调用一个分配函数,该分配函数作为参数显式给定要分配的存储的对齐方式 [expr.new]/14 ...