ano*_*non 25 c++ memory-management
我不想要构造函数调用.我正在使用新的展示位置.
我只想分配一块T.
我的标准方法是:
T* data = malloc(sizeof(T) * num);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道(data + i)是否是T对齐的.此外,我不知道这是否是正确的"C++"方式.
如何在不调用其构造函数的情况下分配T块?
AnT*_*AnT 25
首先,你没有分配"块T*
".你正在分配一个"块T
".
其次,如果你T
有非平凡的构造函数,那么在构造元素之前,你的块实际上并不是"T块",而是一块原始内存.根本不涉及T
这里(计算尺寸除外).甲void *
指针是与原始内存更合适.
要分配内存,您可以使用您喜欢的任何内容
void *raw_data = malloc(num * sizeof(T));
Run Code Online (Sandbox Code Playgroud)
要么
void *raw_data = new unsigned char[num * sizeof(T)];
Run Code Online (Sandbox Code Playgroud)
要么
void *raw_data = ::operator new(num * sizeof(T));
Run Code Online (Sandbox Code Playgroud)
要么
std::allocator<T> a;
void *raw_data = a.allocate(num);
// or
// T *raw_data = a.allocate(num);
Run Code Online (Sandbox Code Playgroud)
之后,当你实际构造元素时(使用placement new,正如你所说),你最终会得到一个有意义的类型指针T *
,但只要内存是原始的,使用T *
就没有意义(尽管它不是错误) .
除非您T
有一些奇特的对齐要求,否则上述分配函数返回的内存将正确对齐.
您可能实际上想要查看C++标准库提供的内存实用程序:std::allocator<>
使用allocate
和construct
方法,以及算法uninitialized_fill
等,或者尝试重新发明轮子.
返回来自malloc
任何类型,因此这不是问题.
通常在C++中,::operator new
将是首选方式.您也可以考虑使用a Allocator<T>
,它提供了一些额外的灵活性(比如能够轻松切换分配器).
归档时间: |
|
查看次数: |
6558 次 |
最近记录: |