开始尝试放置new
和delete
以及内存对齐,感觉就像是在papas smurf实验室中显得很聪明。
让我说我有一个对象,例如,
struct obj {
...
};
我希望在对齐存储中分配一个包含N
个这类对象的数组。我所做的是:
obj *buf = new (static_cast<obj*>(_aligned_malloc(sizeof(obj) * N, 64))) obj[N];
也就是说,我将展示位置new与_aligned_malloc
结合使用。
delete []
解除分配或者我需要一些特殊处理? P.S
我知道_aligned_malloc
不是标准的,而是MVSC特定的。
答案 0 :(得分:1)
您的任务是否足以使用C ++ 11 alignas?
有关delete[]
- aligned_malloc
ed内存的问题应使用_aligned_free
释放。当然你需要先调用析构函数。 Look this answer.
修改强>
#include <malloc.h>
__declspec(align(64))
struct obj
{
int i;
char c;
obj() : i{ 1 }, c{ 'a' } {}
void* operator new[](size_t n)
{
return _aligned_malloc(n, 64);
}
void operator delete[](void* p)
{
_aligned_free(p);
}
};
int main()
{
int N = 10;
obj *buf = new obj[N];
buf[2].i = 1;
delete[] buf;
return 0;
}
在我的机器上,由于new[]
和delete[]
而不是手动malloc / free,它会创建正确对齐的存储,c-tors和d-tors。