使用_aligned_malloc实现C++17自定义对齐分配器的对象合法性疑问
_aligned_malloc实现C++17自定义对齐分配器的对象合法性疑问
嘿,这个问题问到点子上了——C++内存模型里的对象创建规则确实容易让人头大,尤其是涉及到非标准分配函数的时候!
先给你吃个定心丸:在MSVC的C++17环境下,你现在的实现是完全合法的,不需要额外的步骤来标记内存为T[]数组。
为什么这么说呢?虽然C标准里没明确定义_aligned_malloc的行为,但MSVC在C语境下,把它和标准的std::malloc、std::calloc归为同一类内存分配函数——也就是说,当你用_aligned_malloc分配到一块大小足够、对齐符合要求的内存后,这块内存会被隐式视为“可以容纳T[]数组的存储”。你把它转换成T*,后续用placement new在上面构造T对象的操作,MSVC是完全认可的,不会触发未定义行为。
你提到的标准里关于“隐式创建对象”的规则,MSVC在实现时把_aligned_malloc也纳入了这个范畴。它本质上就是带对齐保证的malloc增强版,在对象创建的语义上和malloc完全一致,所以不需要额外调用MSVC特定的函数来“标记”这块内存是T[]数组。
可能你会担心标准里没写,但在MSVC的实际实现中,只要你的内存对齐正确、大小足够容纳size个T对象的存储,转换后直接使用(比如构造对象)就是安全的。你现在的allocate函数写法完全符合MSVC对C++17分配器的要求,后续无论是用placement new手动构造对象,还是通过分配器的配套traits来构造,都不会有问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

