7

我正在阅读 DirectXMath 上的文档,偶然发现了下一段:

作为通过重载 new/delete 直接在 C++ 类中强制对齐的替代方法,您可以使用pImpl 习惯用法。如果您确保您的 Impl 类在内部通过 __aligned_malloc 对齐,则您可以在内部实现中自由使用对齐类型。当“公共”类是 Windows 运行时引用类或旨在与 std::shared_ptr<> 一起使用时,这是一个不错的选择,否则可能会破坏仔细对齐。

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

4

2 回答 2

12

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

std::shared_ptr常与std::make_shared. std::make_shared<T>执行一次分配以为std::shared_ptr控制结构和T实例保留内存。此分配不是使用任何特定于类的operator new(也不应该)完成的。如果特定类operator new设置了比默认分配器更严格的对齐方式,那么很容易看出在使用默认分配器时这会如何失败。

于 2015-07-05T09:51:26.987 回答
0

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

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

于 2020-05-13T08:41:21.590 回答