c++中分配器和内置数组的区别?
Difference between an allocator and a built in array in c++?
我最近一直在尝试创建类似于某些库容器(即矢量、列表)的自定义容器。当我使用分配器分配动态内存时,我注意到分配器和内置数组背后的想法是相同的。分配器保留一定数量的原始、未构造的动态内存和 return 指向该内存池中第一个空闲位置的指针。和内置数组几乎做同样的事情。所以如果我们有一个 std::allocator 用于名为 alloc
的字符串
此代码alloc.allocate(7)
和此代码string* array = new string[7]
应该具有相同的效果。如果我们想构造原始内存,我们可以调用 std::allocator::construct
将 allocate
函数的指针 return 传递给它,或者我们可以使用 array[0] = string("something")
之类的东西来做一样。正确的?
那么分配器的工作方式与内置数组的工作方式有什么区别?
你说得对,它们在根本上是相关的,但不是那种方式。 new string[7]
确实可以分解为 allocate
和 construct
(对于 EH 和其他细节有一些额外的位)。
在分配器接口中将它们分开允许对容器进行更细粒度的控制,这样它们就可以,例如,在其中包含非构造对象的内存,这对于正确的性能保证或语义通常至关重要。
此外,分配器接口当然是一个 接口 ,具有许多可能的实现,例如内存区域或对象池,new string[7]
实际上没有优惠。
最后,new T[]
太垃圾了,永远不要使用它。分配器接口被设计为仅供相当有经验的程序员以非常有限的方式使用——作为更好的库组件的一个组件。 new T[]
是一种每个人都可以使用的语言功能,但结果很糟糕。
数组 是内存中项的槽的共线容器。该数组是一个范围。
一个分配器是一个函数对象(或函数),它保留内存。分配器可以从数组、堆栈、堆或其他内存区域指定 space。分配器也可以用来分配内存区域之外的space,比如硬盘或者其他设备(可能是服务器,云等)
为数组分配的 space 通常由编译器在构建阶段确定。
分配器用于对象的动态(在 运行 时间内)分配。
我最近一直在尝试创建类似于某些库容器(即矢量、列表)的自定义容器。当我使用分配器分配动态内存时,我注意到分配器和内置数组背后的想法是相同的。分配器保留一定数量的原始、未构造的动态内存和 return 指向该内存池中第一个空闲位置的指针。和内置数组几乎做同样的事情。所以如果我们有一个 std::allocator 用于名为 alloc
的字符串
此代码alloc.allocate(7)
和此代码string* array = new string[7]
应该具有相同的效果。如果我们想构造原始内存,我们可以调用 std::allocator::construct
将 allocate
函数的指针 return 传递给它,或者我们可以使用 array[0] = string("something")
之类的东西来做一样。正确的?
那么分配器的工作方式与内置数组的工作方式有什么区别?
你说得对,它们在根本上是相关的,但不是那种方式。 new string[7]
确实可以分解为 allocate
和 construct
(对于 EH 和其他细节有一些额外的位)。
在分配器接口中将它们分开允许对容器进行更细粒度的控制,这样它们就可以,例如,在其中包含非构造对象的内存,这对于正确的性能保证或语义通常至关重要。
此外,分配器接口当然是一个 接口 ,具有许多可能的实现,例如内存区域或对象池,new string[7]
实际上没有优惠。
最后,new T[]
太垃圾了,永远不要使用它。分配器接口被设计为仅供相当有经验的程序员以非常有限的方式使用——作为更好的库组件的一个组件。 new T[]
是一种每个人都可以使用的语言功能,但结果很糟糕。
数组 是内存中项的槽的共线容器。该数组是一个范围。
一个分配器是一个函数对象(或函数),它保留内存。分配器可以从数组、堆栈、堆或其他内存区域指定 space。分配器也可以用来分配内存区域之外的space,比如硬盘或者其他设备(可能是服务器,云等)
为数组分配的 space 通常由编译器在构建阶段确定。
分配器用于对象的动态(在 运行 时间内)分配。