问题标签 [allocator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - uninitialized_copy/fill(In first, In last, For dest, A &a) 是 c++ 标准中的疏忽吗?
我想知道事情是如何工作的,因此一直在深入研究 c++ 标准库。前几天我发生了什么事。
要求容器(例如:)std::vector<int, std::allocator<int> >
使用为分配指定的分配器。具体来说,标准说:
23.1.8
此子句中定义的所有容器类型的复制构造函数从它们各自的第一个参数中复制分配器参数。这些容器类型的所有其他构造函数都采用 Allocator& 参数 (20.1.5),这是一个值类型与容器的值类型相同的分配器。此参数的副本用于在每个容器对象的生命周期内由这些构造函数和所有成员函数执行的任何内存分配。在此子句中定义的所有容器类型中,成员 get_allocator() 返回用于构造容器的分配器对象的副本。
同样在标准的后面它说(在几个不同的地方,但我会选择一个)这样的事情:
效果:使用指定的分配器构造具有 n 个值副本的双端队列。
好的,继续我的问题。
让我们std::vector
以实现以下内容的自然而有效的方式为例:
可能看起来像这样:
具体来说,我们分配一些内存,然后将所有成员复制到适当的位置。不必费心做类似的事情,new value_type[x.size()]
因为那会默认构造数组只是为了覆盖它!。
但是,这不使用分配器来进行复制构造......
我可以手动编写一个循环来执行以下操作:
但这是一种浪费,它几乎与 相同std::uninitialized_copy
,唯一的区别是使用分配器而不是放置新的。
那么,您是否认为标准没有(对我来说似乎很明显)这样的一组功能是一种疏忽:
我想,如果人们想在那里实现自己的容器等并有效地利用复制构造,那么这些类型的函数(即使手动实现它们是微不足道的......直到你试图让它们异常安全)将被证明是相当有用的在使用分配器时。
想法?
c++ - scoped_ptr 中对象的快速分配?
既然scoped_ptr
保证给定线程中的所有对象都以类似堆栈的方式分配,那么为 下的对象指定“自定义堆”最不痛苦的方法是scoped_ptr
什么?
(例如对于vector
s、deque
s、string
s 等)
(这将使我们几乎完全避免传统的堆开销,得到一个几乎与堆栈一样快但与堆一样大的池。)
memory - 使用自定义 Lua 分配器计算内存使用量,但其结果与 collectgarbage('count') 不同
我最近正在尝试跟踪我们项目中的 lua 内存使用情况,并且我遇到了使用 lua_Alloc 自定义分配器来完成此任务的想法。好吧,分配器代码看起来很简单,而且看起来工作正常。
但是很快,这个小函数就遇到了两个挑战:
1.它输出的结果与collectgarbage('count')给出的值有很大的不同;
2.假设当前内存使用量是M字节,那么我们输入一些nil引用并调用gc,内存使用量会大于M字节。例如:A 返回,B 返回,C 返回,...,collectgarbage()
好吧,我听说如果你正确使用 lua,就不会有内存泄漏,所以我认为我在计算内存使用量时做错了。请帮我弄清楚。提前致谢。
下面附上可编译的代码:
关于#2的输入序列:
c++ - 使用分配器类的向量实现
这是向量类的一个实现。它使用类型为 T 的动态数组,该数组随着函数 reserve() 而变大。如果我使用分配器类来实现它会怎么样?(整个向量类,而不仅仅是保留函数)
这是文件 stl_vector.h 上的样子
c++ - std::vector 如何分配对象?
如何std::vector
分配对象?看起来好像它只是std::allocator::allocate
用来创建一块内存,但从不调用std::allocate::construct
. 这是真的?是否std::vector
只分配内存而从不将对象构造为内存分配?
如果没有默认构造函数怎么办?对象上没有默认构造函数时如何调用构造函数?如果有多个参数怎么办?
例如,使用此代码没有默认构造函数,并且 std::allocator 允许它。
c++ - 用于快速 std::wstring 分配的自定义分配器
是否有任何开源分配器(可能在 Boost 中)可用于std::wstring
实现快速分配模式,如本博文中所示?
Boost.Pool似乎不太适合这个目的。
c++ - Boost 快速池分配器的函数指针有问题?
这是一个 Boost 错误还是我做错了什么?
最后一行无法在带有 Boost 1.40 和 1.48 的 MS Visual Studio 2008 下编译。不过,它在 g++ 4.5.3 (Cygwin) 下编译得很好。
错误是:
c++ - 为什么 std::allocator::construct 和 std::allocator::destroy 以元素类型为模板?
std::allocator
的construct
和destroy
成员函数根据要构造的元素的类型进行参数化:
这样做的理由是什么?为什么他们不接受value_type*
or pointer
?似乎allocator<T>
应该只知道如何构造或销毁类型的对象T
。
memory-management - OpenCV 的自定义内存分配器
是否可以为 OpenCV 2.3.1 设置自定义分配器?我创建了一个内存池,我希望 OpenCV 使用该池来满足它的需要。
那可能吗?如果是,怎么办?
更新:
自上次回答以来,我取得了一些进展,但我仍然有一些问题。这是我现在的代码:
现在,我的问题是,我怎样才能访问我想要分配的数据的大小和指针,然后再解除分配?
刚刚发现:我使用的OpenCV版本(2.3.1)在使用cvSetMemoryManager时会报错。原因在于它的源代码:
我对此感到非常失望。我想我不能再在 OpenCV 中使用自定义内存池了!
c++ - 为什么标准类型不提供来自分配器不同来源的转换构造函数/赋值
例如,为什么不template< typename Elem, typename Traits, typename Alloc > basic_string { ... }
提供:
实现这样一个尊重两个分配器的转换构造函数似乎相当简单。当前的情况使得在分配器不同的类型之间进行接口变得非常麻烦。