gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:10:58 24 4
gpt4 key购买 nike

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

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

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

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,但我的“什么胡说八道?”代码感知正在关闭。这会导致指向(当然)对齐代码的指针吗?

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

最佳答案

该代码存在一些问题。

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

您可以简单地通过不初始化 unique_ptr 来解决第一个问题。用new Basic() .

第二个可以使用 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 ,您可能想要也可能不想要。

关于使用 _aligned_malloc() 的 unique_ptr<> 的 C++ 数据对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com