我正在DirectXMath上阅读文档,无意中发现了下一段:
作为在C++类中直接通过重载new/delete,可以使用pImpl习惯用法如果您确保Impl类在内部通过__aligned_malloc对齐,您可以然后在内部实现中自由使用对齐的类型。这当"public"类是Windows运行时引用时,是一个不错的选项类或打算与std::shared_ptr<>一起使用,否则打乱了仔细的排列。
我不明白shared_ptr是如何改变对齐策略的,它只有一个指针,没有分配对象。
没错,std::shared_ptr
不会影响对齐。它只接收一个指向已分配对象的指针,因此,如果该分配导致对象错位,问题不在于std::shared_ptr
,而在于该分配。
但std::shared_ptr
经常与std::make_shared
一起使用。CCD_ 5执行单个分配以为CCD_ 6控制结构和CCD_。此分配不是使用任何特定于类的operator new
来完成的(也不应该使用(。如果特定于类的operator new
设置了比默认分配器更严格的对齐,那么当使用默认分配器时,很容易看出这是如何失败的。
这就是为什么有时侵入式ref计数比std::shared_ptr更受欢迎,您可以显式声明类的对齐要求。
另外,请记住将析构函数声明为private,以禁止(取消(对堆栈的分配。