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

Ras*_*lis 3 c++ malloc vector memory-alignment unique-ptr

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

class Basic
{
public:
    Basic();
    ~Basic();
};
Run Code Online (Sandbox Code Playgroud)

这是这里的标准对象。接下来,unique_ptr将a 分配给new的实例,Basic以获得这样做的好处。(与标准指针相反)

unique_ptr<Basic> e_Basic{new Basic()};
Run Code Online (Sandbox Code Playgroud)

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

e_Basic.reset =_aligned_malloc((size_t)sizeof(Basic), (size_t)(16 + (sizeof(Basic) % 16))); //Verify alignment.
Run Code Online (Sandbox Code Playgroud)

最后将指针添加到vector数组中。

LocalBasicQueue.push_back(move(e_Basic));
Run Code Online (Sandbox Code Playgroud)

编译器说它是犹太洁食,但我的“胡扯什么?” 代码意识正在消失。这会导致指向(肯定)对齐代码的指针吗?

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

Mil*_*nek 5

该代码存在一些问题。

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

您可以通过不unique_ptr使用new Basic().

第二个可以使用放置新表达式来修复。

第三个问题可以通过提供unique_ptr一个调用~Basicand_aligned_free而不是delete Note 的自定义删除器来修复,尽管 aunique_ptr<Basic, my_deleter>是与 不同的类型unique_ptr<Basic>,因此您不能将其放入 a 中vector<unique_ptr<Basic>>

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