如何在不调用默认构造函数的情况下创建C样式数组?

Joh*_*ski 5 c++ constructor memory-management

我正在编写一个内存管理模板类,我想在其中创建一个固定大小的C风格数组,作为堆.我将对象存储在一个数组中,如下所示:

T v[SIZE];
Run Code Online (Sandbox Code Playgroud)

因为这只能作为可以容纳T对象的堆的角色,所以我不希望为数组中的每个对象自动调用T默认构造函数.

我想到了像这样定义堆的解决方案:

char v[SIZE * sizeof(T)];
Run Code Online (Sandbox Code Playgroud)

......但这会给我一些对齐问题.

有没有更好的方法来实现这一目标?

ADD:由于我有特殊的运行时要求,因此该类不对全局堆进行任何分配是至关重要的.

ADD 2:SIZE是一个模板参数,在编译时已知.

Joe*_*oeG 6

标准容器使用分配器来分离/解除构造/销毁的分配.标准库提供了一个在堆上分配的分配器.

此代码声明了一个足够大的数组,用于保存具有正确allignment SIZE的类型元素T:

typedef typename std::tr1::aligned_storage<sizeof(T),std::tr1::alignment_of<T>::value>::type aligned_storage;
aligned_storage array[SIZE];
Run Code Online (Sandbox Code Playgroud)

使用的解决方案std::allocator不能用于在堆栈上声明数组,并且由于标准容器要求自定义分配器不保持状态,因此自定义分配器也不能用于在堆栈上进行分配.

如果您的编译器不支持,std::tr1::alignment_of您可以使用boost::alignment_of.