C++ 阵列放置与“对齐的”malloc组合的新功能,什么';删除的正确方法是什么?

C++ 阵列放置与“对齐的”malloc组合的新功能,什么';删除的正确方法是什么?,c++,visual-c++,memory-alignment,placement-new,C++,Visual C++,Memory Alignment,Placement New,开始尝试放置new和delete以及记忆对齐,感觉就像是在爸爸的实验室里聪明的蓝精灵 假设我有一个对象,例如 struct obj { ... }; 我想在对齐存储中分配一个包含N这样的对象的数组。我所做的是: obj *buf = new (static_cast<obj*>(_aligned_malloc(sizeof(obj) * N, 64))) obj[N]; obj*buf=new(静态(对齐的)malloc(sizeof(obj)*N,64)))obj[N]; 也

开始尝试放置
new
delete
以及记忆对齐,感觉就像是在爸爸的实验室里聪明的蓝精灵

假设我有一个对象,例如

struct obj {
...
};
我想在对齐存储中分配一个包含
N
这样的对象的数组。我所做的是:

obj *buf = new (static_cast<obj*>(_aligned_malloc(sizeof(obj) * N, 64))) obj[N];
obj*buf=new(静态(对齐的)malloc(sizeof(obj)*N,64)))obj[N];
也就是说,我将placement new与
\u aligned\u malloc
结合使用

Q
  • 这种分配对齐存储的方式是否合适
  • 以后使用
    delete[]
    取消分配是否可以(可能不可以),或者我需要一些特殊处理
附言
我知道
\u aligned\u malloc
不是标准的,而是特定于MVSC的。

您的任务使用C++11还不够吗

关于
delete[]
-
aligned\u malloc
ed内存应使用
\u aligned\u free
释放。当然你需要先调用析构函数

编辑:

#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;
}
#包括
__declspec(对齐(64))
结构对象
{
int i;
字符c;
obj():i{1},c{'a'}{}
void*运算符新[](大小\u t n)
{
返回对齐的malloc(n,64);
}
void运算符delete[](void*p)
{
_无尿(p);
}
};
int main()
{
int N=10;
obj*buf=新obj[N];
buf[2].i=1;
删除[]buf;
返回0;
}

在我的机器上,它创建了正确对齐的存储,调用c-tors和d-tors是因为
new[]
delete[]
而不是手动malloc/free。

显式析构函数调用不是更合适吗?我的意思是像
buf->~obj()
然后函数释放内存?@W.F.我有一个想法,我必须像你建议的那样做,然后调用
\u aligned\u free
。另一方面,这里真的需要
静态转换吗?AFAIK placement new将
void*
作为参数。您不需要静态_cast@tehcnically新数组位置不可用,因为它可能需要未指定的簿记开销,而您在malloc中不允许这种开销。“正确”的方法是循环N次调用非数组位置,每个timeStupid足够新,我想将我的特性包含在C++11之前。你看,经理的意见占20票。@101010秒的编辑,我认为这是正确的做法this@101010-根据我的经验,经理的决定比20票重要得多。更改编译器版本是一个非常重要的业务风险,如果您必须支持旧版本的AIX/HPUX(spit!),您可能没有选择。