提问者:小点点

malloc与std::allocator<t>::allocate之间的差异


我知道这两个函数都接受size_t数字。 对于malloc,该数字是原始字节,对于allocate,该数字是该类型的rahtern*sizeof(T)。 那么内部分配调用malloc吗? 另外,从关于allocatecpp引用中:

通过调用::运算符new(std::size_t),分配未初始化存储的n*sizeof(T)字节

它调用new运算符。 但据我所知,new运算符不仅分配内存,而且还使用类型的构造函数初始化内存,在哪些情况下我使用malloc和/或new?:

new关键字是C++的方法,它将确保您的类型将调用它的构造函数

但是引用声明它将返回未初始化的,仅分配的内存,就像malloc那样。 所以问题也有点关于new,它是否也初始化(通过调用默认构造函数或针对基元类型的value-initilize)? 以及是否通过它的实现分配调用malloc,或者它如何向OS请求原始内存块/


共1个答案

匿名用户

您对std::allocator::allocate的引用:

通过调用::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获得原始内存块

这不能说是依赖于实现的,但是对于常见的实现,您可能可以假设mallocallocate在内部使用相同的系统调用,但是如果allocate直接使用这个,或者间接地使用malloc也是依赖于实现的。