C++ 共享的ptr如何破坏对齐

C++ 共享的ptr如何破坏对齐,c++,c++11,stl,shared-ptr,directxmath,C++,C++11,Stl,Shared Ptr,Directxmath,我正在读DirectXMath上的文档,无意中发现了下一段: 作为C++类中直接执行对齐的替代方案 重载new/delete时,可以使用pImpl习惯用法。如果你保证 您的Impl类在内部通过uuu aligned_malloc对齐,您可以 然后在内部实现中自由使用对齐类型。这 当“public”类是Windows运行时引用时,是一个很好的选项 类或用于std::shared_ptr,否则 破坏仔细排列 我不明白shared_ptr如何改变对齐策略,它只有一个指针,没有分配对象。没错,std::

我正在读DirectXMath上的文档,无意中发现了下一段:

作为C++类中直接执行对齐的替代方案 重载new/delete时,可以使用pImpl习惯用法。如果你保证 您的Impl类在内部通过uuu aligned_malloc对齐,您可以 然后在内部实现中自由使用对齐类型。这 当“public”类是Windows运行时引用时,是一个很好的选项 类或用于std::shared_ptr,否则 破坏仔细排列


我不明白shared_ptr如何改变对齐策略,它只有一个指针,没有分配对象。

没错,
std::shared_ptr
不会影响对齐。它只接收指向已分配对象的指针,因此如果该分配导致对象未对齐,问题不在于
std::shared_ptr
,而在于该分配


但是
std::shared_ptr
通常与
std::make_shared
一起使用
std::make_shared
执行单个分配,为
std::shared_ptr
控制结构和
T
实例保留内存。此分配不使用任何特定于类的
运算符new
(也不应该这样)。如果特定于类的
操作符new
设置了比默认分配器更严格的对齐方式,那么很容易看出当使用默认分配器时,这可能会失败。

这就是为什么有时侵入式引用计数优于std::shared\ptr,您可以显式声明类的对齐要求


另外,请记住将析构函数声明为私有,以禁止(取消)堆栈上的分配。

我同意。在我看来,这些文件已经过时了。在c++11中,您可以通过属性指定数据类型的对齐方式。此外,即使
运算符new
使用16字节对齐方式(例如使用x64 native),该标准不需要为std::make_shared分配额外的空间,它尊重类本身的对齐方式。我花了1000个小时的调试终于找到了罪魁祸首。谢谢