我知道这两个函数都接受size_t
数字。 对于malloc
,该数字是原始字节,对于allocate
,该数字是该类型的rahtern*sizeof(T)
。 那么内部分配
调用malloc
吗? 另外,从关于allocate
cpp引用中:
通过调用::运算符new(std::size_t),分配未初始化存储的n*sizeof(T)字节
它调用new
运算符。 但据我所知,new
运算符不仅分配内存,而且还使用类型的构造函数初始化内存,在哪些情况下我使用malloc和/或new?:
new关键字是C++的方法,它将确保您的类型将调用它的构造函数
但是引用声明它将返回未初始化的,仅分配的内存,就像malloc
那样。 所以问题也有点关于new
,它是否也初始化(通过调用默认构造函数或针对基元类型的value-initilize)? 以及是否通过它的实现分配
调用malloc
,或者它如何向OS请求原始内存块/
您对std::allocator
的引用:
通过调用::operator new(Sd::size_t)
或::operatornew(Sd::size_t,std::align_val_t)
来分配未初始化存储的n*sizeof(T)字节
不引用创建和初始化对象的new
表达式。 而是传递给运算符new,该运算符由C++运行时调用,以便在new
表达式的情况下分配内存。
默认运算符new
在内部可能如下所示:
void* operator new(std::size_t sz) {
void *ptr = std::malloc(sz);
if (ptr)
return ptr;
else
throw std::bad_alloc{};
}
但这是依赖于实现的,它可以在内部使用操作系统提供的任何方法来分配内存。 对于嵌入式系统,它甚至可能是一个管理预分配内存的函数。
并且是否通过它的实现分配调用malloc,或者它如何请求OS获得原始内存块
这不能说是依赖于实现的,但是对于常见的实现,您可能可以假设malloc
和allocate
在内部使用相同的系统调用,但是如果allocate
直接使用这个,或者间接地使用malloc
也是依赖于实现的。