unique_ptr<> 使用 _aligned_malloc() 的 C++ 数据对齐

C++ data alignment of unique_ptr<> using _aligned_malloc()

我试图确保对象在添加到 vector 数据结构之前对齐。响应 warning C4316: 'Basic' : object allocated on the heap may not be aligned 16 警告,我有以下 Basic 对象:

class Basic
{
public:
    Basic();
    ~Basic();
};

这里是标准对象。接下来,unique_ptrBasicnew 实例被分配用于这样做的好处。 (与标准指针相反)

unique_ptr<Basic> e_Basic{new Basic()};

并且我尝试对齐数据,以便以后避免对齐问题:

e_Basic.reset =_aligned_malloc((size_t)sizeof(Basic), (size_t)(16 + (sizeof(Basic) % 16))); //Verify alignment.

最后添加指向 vector 数组的指针。

LocalBasicQueue.push_back(move(e_Basic));

编译器说它是 kosher,但我的 "What the fudge?" 代码感觉不对劲。这会导致指向(当然)对齐代码的指针吗?

以这种方式声明 (e_Basic.reset) 等于一个指针 [由 _aligned_malloc()] 返回并调用其 unique_ptr<> 并分配新指针是否可以?

该代码存在一些问题。

  1. 您无缘无故地分配、构造然后立即销毁了一个 Basic 对象。
  2. 您永远不会在 _aligned_malloc 分配的内存中初始化 Basic 对象。
  3. 默认情况下 unique_ptr 将释放它使用 delete 管理的内存,但您没有 new 那个内存,您 _aligned_malloc 编辑了它。这是一个坏主意,可能会导致堆损坏 and/or 崩溃。

您可以简单地通过不使用 new Basic().

初始化您的 unique_ptr 来解决第一个问题

第二个可以使用 placement new 表达式修复。

第三个可以通过给 unique_ptr 一个自定义删除器来修复,该删除器调用 ~Basic_aligned_free 而不是 delete 请注意 unique_ptr<Basic, my_deleter>是与 unique_ptr<Basic> 不同的类型,因此您不能将其放入 vector<unique_ptr<Basic>>.

第二个和第三个问题也可以通过重载 Basic::operator newBasic::operator delete 分别使用 _aligned_malloc_aligned_delete 来解决,但这意味着 new Basic() 总是使用 _aligned_malloc,你可能想要也可能不想要。