Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在有范围的ptr中非常快速地分配对象?_C++_Heap_Allocator_Scoped Ptr - Fatal编程技术网

C++ 在有范围的ptr中非常快速地分配对象?

C++ 在有范围的ptr中非常快速地分配对象?,c++,heap,allocator,scoped-ptr,C++,Heap,Allocator,Scoped Ptr,既然scoped_ptr保证了给定线程中的所有对象都以类似堆栈的方式分配,那么为scoped_ptr下的对象指定“自定义堆”最简单的方法是什么? (例如,对于vectors、deques、strings等) (这将允许我们几乎完全避免传统的堆开销,得到一个几乎与堆栈一样快,但与堆一样大的池。)作用域\u ptr,一般来说,智能指针对它们所持有的对象分配的内存没有影响。如果出于某种原因,您有一个作用域\u ptr,那么std::vector*存储在作用域\u ptr中的事实与std::vector

既然
scoped_ptr
保证了给定线程中的所有对象都以类似堆栈的方式分配,那么为
scoped_ptr
下的对象指定“自定义堆”最简单的方法是什么?
(例如,对于
vector
s、
deque
s、
string
s等)


(这将允许我们几乎完全避免传统的堆开销,得到一个几乎与堆栈一样快,但与堆一样大的池。)

作用域\u ptr
,一般来说,智能指针对它们所持有的对象分配的内存没有影响。如果出于某种原因,您有一个
作用域\u ptr
,那么
std::vector*
存储在
作用域\u ptr
中的事实与
std::vector
从何处获取内存完全无关

当然,事实上,
std::vector
已经是一个RAII类型(与所有其他标准库类一样),它将在自身之后进行清理,这意味着将它们粘贴在
范围的ptr
中是毫无意义的


简言之,您所谈论的与
scoped\u ptr
完全无关。它与容器类使用的分配器有关。你找错了方向。

作用域\u ptr
和智能指针通常不会影响它们所持有的对象分配的内存。如果出于某种原因,您有一个
作用域\u ptr
,那么
std::vector*
存储在
作用域\u ptr
中的事实与
std::vector
从何处获取内存完全无关

当然,事实上,
std::vector
已经是一个RAII类型(与所有其他标准库类一样),它将在自身之后进行清理,这意味着将它们粘贴在
范围的ptr
中是毫无意义的


简言之,您所谈论的与
scoped\u ptr
完全无关。它与容器类使用的分配器有关。你找错树了。

scoped\u ptr不能保证分配策略的任何内容,只是一旦超出范围它就会调用删除程序。@CoryNelson:它还保证不能复制或移动它,不是吗?这意味着,除非指针被显式转义(这是程序员的错误,很容易避免),否则在任何给定线程上,两个
scoped_ptr
s必须按照创建它们的相反顺序被销毁。@Mehrdad:我想这是因为这个问题是非理性的。这有点刺耳…@MatthieuM:我真的不明白为什么这是荒谬的。我希望关于堆栈式分配的部分至少有意义?关于分配,例如,如果
scoped_ptr
可以在分配/释放期间临时“钩住”底层内存分配接口,这将回答我的问题。或者有更好的办法,我不知道。你能详细解释一下为什么没有意义吗?@Mehrdad:怎么解释?我重复一遍,你把一个已经分配的对象传递给
范围内的\u ptr
,那么
范围内的\u ptr
怎么能影响一个在它开始发挥作用之前发生的事件呢?范围内的\u ptr不能保证任何分配策略,只是一旦删除程序超出范围,它就会调用它。@CoryNelson:它还保证它不能被复制或移动,不是吗?这意味着,除非指针被显式转义(这是程序员的错误,很容易避免),否则在任何给定线程上,两个
scoped_ptr
s必须按照创建它们的相反顺序被销毁。@Mehrdad:我想这是因为这个问题是非理性的。这有点刺耳…@MatthieuM:我真的不明白为什么这是荒谬的。我希望关于堆栈式分配的部分至少有意义?关于分配,例如,如果
scoped_ptr
可以在分配/释放期间临时“钩住”底层内存分配接口,这将回答我的问题。或者有更好的办法,我不知道。你能详细解释一下为什么没有意义吗?@Mehrdad:怎么解释?我重复一遍,您将一个已分配的对象传递给
范围内的\u ptr
,那么
范围内的\u ptr
如何影响一个在事件开始运行之前发生的事件?嗯,您不必为此使用分配器,是吗?难道没有办法在类内使用
操作符new
-重载技巧,比如
作用域的ptr
,或者临时挂接全局内存分配器(可能基于类型?)之类的东西吗?我知道分配器是一种解决方案,但它们是唯一(或最好/最简单)的解决方案吗?@Mehrdad:
scoped\u ptr
不是魔术。它所做的只是存储一个指针,当您请求它时给出它,然后在其析构函数中删除它。除此之外,它对实际存储的内容一无所知。影响标准库容器内存来源的方法是使用分配器;没有替代方法。重载
运算符new
不会有帮助,因为它们不使用
运算符new
。他们使用分配器。是的,我已经知道
scoped_ptr
做了什么,但似乎您不必要地过度限制了问题。例如,您不能创建一个内部使用
作用域ptr
并分配对象的新类吗?或者你不能把
的代码调整一下,让它工作起来吗?我不明白你为什么对这个问题限制这么多…@Mehrdad:你可以做很多事情。您可以有一个特殊的“容器持有者”,它可以自动将一个特殊的分配器挂接到它存储的容器中,从而从某个池的某处提取内存。但你没问这个。您询问了
范围\u ptr
。我只能回答你的问题,而不是你认为你在问的问题