我不想要构造函数调用。我正在使用新的展示位置。
我只想分配一个T块。
我的标准方法是:
T* data = malloc(sizeof(T) * num);
然而,我不知道(data + i)是否是T对齐的。此外,我不知道这是否是正确的“C ++”方式。
如何在不调用构造函数的情况下分配T块?
答案 0 :(得分:25)
首先,您没有分配“T*
块”。您正在分配“T
块”。
其次,如果您的T
具有非平凡的构造函数,那么在构造元素之前,您的块实际上不是“T块”,而是一块原始内存。在这里涉及T
没有意义(计算大小除外)。 void *
指针更适合原始内存。
要分配内存,您可以使用任何您喜欢的内容
void *raw_data = malloc(num * sizeof(T));
或
void *raw_data = new unsigned char[num * sizeof(T)];
或
void *raw_data = ::operator new(num * sizeof(T));
或
std::allocator<T> a;
void *raw_data = a.allocate(num);
// or
// T *raw_data = a.allocate(num);
稍后,当你实际构造元素时(使用placement new,如你所说),你最终会得到一个类型为T *
的有意义的指针,但只要内存是raw,就使用{{1没有意义(虽然这不是错误)。
除非T *
有一些奇特的对齐要求,否则上述分配函数返回的内存将正确对齐。
您可能真的想看一下C ++标准库提供的内存实用程序:T
使用std::allocator<>
和allocate
方法,算法作为construct
等。相反或试图重新发明轮子。
答案 1 :(得分:6)
malloc
的回复符合任何类型,因此不是问题。
通常在C ++中,::operator new
将是首选方式。您也可以考虑使用Allocator<T>
,它提供了一些额外的灵活性(比如能够轻松切换分配器。
答案 2 :(得分:1)
T* data = reinterpret_cast<T*>(operator new(sizeof(T) * num));
或者只使用std::vector<T>
并且不要担心这些低级内存细节;)