shared_ptr 如何破坏对齐

How can shared_ptr disrupt alignment

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

As an alternative to enforcing alignment in your C++ class directly by overloading new/delete, you can use the pImpl idiom. If you ensure your Impl class is aligned via __aligned_malloc internally, you can then freely use aligned types within the internal implementation. This is a good option when the 'public' class is a Windows Runtime ref class or intended for use with std::shared_ptr<>, which can otherwise disrupt careful alignment.

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

你说得对,std::shared_ptr不影响对齐。它只接受一个指向已分配对象的指针,因此如果该分配导致对象未对齐,问题不在于 std::shared_ptr,而在于该分配。

但是std::shared_ptr经常和std::make_shared一起使用。 std::make_shared<T> 执行一次分配,为 std::shared_ptr 控制结构和 T 实例保留内存。此分配不是使用任何 class 特定的 operator new 完成的(也不应该)。如果 class-specific operator new 设置比默认分配器所做的更严格的对齐,那么很容易看出当使用默认分配器时它会如何失败。

这就是为什么有时侵入式引用计数优于 std::shared_ptr 的原因,您可以明确声明 class.

的对齐要求

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