posix_memalign
and _aligned_malloc
在 Windows 上允许动态分配对齐的内存块。 C++11中有类似的东西吗?据我所知,alignas
关键字仅适用于静态分配的对象。
这取决于您需要什么对齐方式。对于任何 alignof(std::max_align_t), new
按照 n3242 3.7.4.1/2 工作:
返回的指针应适当对齐,以便可以
转换为具有基本功能的任何完整对象类型的指针
对齐要求
std::max_align_t
是具有最严格基本对齐的完整对象类型。
请注意,数组的分配char
or unsigned char
但不是signed char
5.3.4/10 中有不同的规则:
对于 char 和 unsigned char 数组,结果之间的差异
new 表达式和分配返回的地址
函数应为最严格基本函数的整数倍
任何尺寸为 no 的对象类型的对齐要求 (3.11)
大于正在创建的数组的大小。
So new char[1];
对齐方式可以为 1。
至于分配内存的对齐方式大于alignof(std::max_align_t)
,C++11 没有提供直接的方法来执行此操作。唯一可靠的方法是至少分配size + alignment
字节和使用标准::对齐以获得此缓冲区中正确对齐的位置。
这可能会浪费大量内存,因此如果您需要大量内存,您可以创建一个分配器,为所有内存分配足够大的块,并在其上使用 std::align 。然后,您的管理费用将在所有分配中摊销。
您的另一个选择是等待http://open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3396.htm使其成为标准。
就我个人而言,我只会在操作系统提供的 API 上编写一个抽象层来分配对齐的内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)