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.
的对齐要求
此外,请记住将析构函数声明为私有的,以禁止在堆栈上分配(取消)分配。
我正在阅读有关 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.
的对齐要求此外,请记住将析构函数声明为私有的,以禁止在堆栈上分配(取消)分配。