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_ptr
到 Basic
的 new
实例被分配用于这样做的好处。 (与标准指针相反)
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<>
并分配新指针是否可以?
该代码存在一些问题。
- 您无缘无故地分配、构造然后立即销毁了一个
Basic
对象。
- 您永远不会在
_aligned_malloc
分配的内存中初始化 Basic
对象。
- 默认情况下
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 new
和 Basic::operator delete
分别使用 _aligned_malloc
和 _aligned_delete
来解决,但这意味着 new Basic()
总是使用 _aligned_malloc
,你可能想要也可能不想要。
我试图确保对象在添加到 vector
数据结构之前对齐。响应 warning C4316: 'Basic' : object allocated on the heap may not be aligned 16
警告,我有以下 Basic
对象:
class Basic
{
public:
Basic();
~Basic();
};
这里是标准对象。接下来,unique_ptr
到 Basic
的 new
实例被分配用于这样做的好处。 (与标准指针相反)
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<>
并分配新指针是否可以?
该代码存在一些问题。
- 您无缘无故地分配、构造然后立即销毁了一个
Basic
对象。 - 您永远不会在
_aligned_malloc
分配的内存中初始化Basic
对象。 - 默认情况下
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 new
和 Basic::operator delete
分别使用 _aligned_malloc
和 _aligned_delete
来解决,但这意味着 new Basic()
总是使用 _aligned_malloc
,你可能想要也可能不想要。