我正在努力了解功能memalign()
和功能posix_memalign()
.阅读可用的文档没有帮助.
有人可以帮助我理解它是如何工作的以及它用于什么?或者,也许提供一个用法示例?
我试图了解linux内存是如何工作的,我需要编写自己的简单内存池(低碎片堆).
我有一个程序包含一个处理阶段,需要从多态类型树中使用一堆不同的对象实例(都在堆上分配),所有这些实例最终都是从一个公共基类派生出来的.
由于实例可能循环引用彼此,并且没有明确的所有者,我希望将它们分配new
,用原始指针处理它们,并将它们留在内存中用于阶段(即使它们变得未被引用),然后在阶段之后使用这些实例的程序,我想一次删除它们.
我如何构建它如下:
struct B; // common base class
vector<unique_ptr<B>> memory_pool;
struct B
{
B() { memory_pool.emplace_back(this); }
virtual ~B() {}
};
struct D : B { ... }
int main()
{
...
// phase begins
D* p = new D(...);
...
// phase ends
memory_pool.clear();
// all B instances are deleted, and pointers invalidated
...
}
Run Code Online (Sandbox Code Playgroud)
除了小心所有B实例都使用new分配,并且在清除内存池后没有人使用任何指针时,这个实现是否存在问题?
具体来说,我担心在派生类构造函数完成之前,this
指针用于std::unique_ptr
在基类构造函数中构造a .这是否会导致未定义的行为?如果有的话有解决方法吗?
我试图理解使用内存池进行内存管理,但我找不到太多关于它的内容,尽管它似乎是一种非常常见的机制.
我所知道的就是每个维基百科的 "内存池,也称为固定大小的块分配" ,我可以使用这些块为我的对象分配内存.
有关内存池的标准规范吗?
我想知道它在堆上是如何工作的,它是如何实现的,以及如何使用它?
如果你还没有,请熟悉Boost.Pool.从Boost文档中:
什么是游泳池?
池分配是一种非常快速的内存分配方案,但其使用受到限制.有关池分配更多的信息(也称为简单的分隔式,看概念概念和简单的分隔式.
我可以理解他的意思,但这并不能帮助我理解如何使用它们以及内存池如何帮助我的应用程序,如何实际使用它们.
将会欣赏一个显示如何使用内存池的简单示例.
我遇到了与bytes
Python3.2 相关的内存管理问题.在某些情况下,ob_sval
缓冲区似乎包含我无法解释的内存.
对于特定的安全应用程序,我需要能够确保内存"归零"并在不再使用后尽快返回给操作系统.由于重新编译Python实际上不是一个选项,我正在编写一个可以与LD_PRELOAD一起使用的模块:
PyObject_Malloc
用PyMem_Malloc
,PyObject_Realloc
用PyMem_Realloc
,并PyObject_Free
用PyMem_Free
(例如:你会得到什么,如果你没有编译WITH_PYMALLOC
).我不在乎记忆是否合并,但这似乎是最简单的方法.malloc
,realloc
以及free
跟踪请求的内存量以及发布时的memset
所有内容0
.粗略地看一下,这种方法似乎很有效:
>>> from ctypes import string_at
>>> from sys import getsizeof
>>> from binascii import hexlify
>>> a = b"Hello, World!"; addr = id(a); size = getsizeof(a)
>>> print(string_at(addr, size))
b'\x01\x00\x00\x00\xd4j\xb2x\r\x00\x00\x00<J\xf6\x0eHello, World!\x00'
>>> del a
>>> print(string_at(addr, size))
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00'
Run Code Online (Sandbox Code Playgroud)
最后的错误\x13
是奇怪的,但不是来自我的原始值,所以起初我认为它没关系.我很快找到了不太好的例子:
>>> a = …
Run Code Online (Sandbox Code Playgroud) 基本上,我需要一个内存池来快速分配小对象.理想情况下,我想替换主机上的分配,以及使用cudaMalloc在GPU上分配的内存.我可以写自己的,如果必须,我会,但我不介意交换一个可靠的开源实现.
唯一的问题是,使用cudaMalloc,内存池无法触及分配的内存.我的理解是,许多(所有?)公共内存分配器(如标题中的那些)在分配的数据中存储少量元数据.因此它们不起作用.
有没有人知道一个内存分配器,但事实并非如此?
我一直听说内存池在分配内存时可以显着提高性能..那么为什么传统的 malloc 实现不以某种方式使用它们呢?
我知道部分原因是内存池使用固定大小的内存块,但似乎有些没有,他们唯一需要的是提前获取一点额外的内存。有没有一种方法可以将它们充分概括用于此类目的?
我想知道如何将C++ - FAQ-lite的第11.14节适用于数组.
基本上,我想要这样的东西:
class Pool {
public:
void* allocate(size_t size) {...}
void deallocate(void* p, size_t size) {...}
};
void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); }
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); }
struct Foo {...};
int main() {
Pool pool;
Foo* manyFoos = new (pool) Foo [15];
/* ... */
delete [] (pool) manyFoos;
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚声明和调用它的正确语法operator delete[] (pool)
.有人可以帮忙吗?
我正在使用一个内存池类,它重用已分配的内存地址和一个包装该类的自定义分配器.以下代码段为您提供了界面的基本概念.
template<class alloc>
class memory_pool
: boost::noncopyable,
public allocator_traits<void>
{
public:
memory_pool(typename alloc::size_type alloc_size);
memory_pool(typename alloc::size_type alloc_size, alloc const&);
template<typename U> memory_pool(typename alloc::size_type alloc_size,
typename alloc::rebind<U>::other const&);
virtual ~memory_pool();
pointer allocate (); /*throw(std::bad_alloc)*/
void collect ();
void deallocate(pointer) throw(); /*noexcept*/
};
pointer allocate()
{/*
Checks if a suitable chunk of memory is available in a internal linked list.
If true, then the chunk is returned and the next chunk moves up.
Otherwise, new memory is allocated by the underlying allocator. …
Run Code Online (Sandbox Code Playgroud) 我需要一个简单的非阻塞静态块大小的内存池.我没有在网上找到这样的东西.所以每个人都需要这样的解决方案.这个是免费的...只适用于Win32.
最好的祝福,
弗里德里希
#ifndef MEMPOOL_HPP_INCLUDED
#define MEMPOOL_HPP_INCLUDED
#include "atomic.hpp"
#include "static_assert.hpp"
#pragma warning( push )
#pragma warning( disable : 4311 ) // warning C4311: 'Typumwandlung'
/// @brief Block-free memory-pool implemenation
/// @tparam T Object-type to be saved within the memory-pool.
/// @tparam S Capacy of the memory-pool.
template <typename T, int S>
class MemoryPool
{
private:
STATIC_ASSERT(sizeof(int) == sizeof(void*), "Well, ...");
public:
/// @brief Object-type saved within the pool.
typedef T TYPE;
enum
{
/// @brief Capacy of the memory-pool. …
Run Code Online (Sandbox Code Playgroud) 我需要对内存池的概念和实现做一些澄清.
通过维基上的内存池,它说
也称为固定大小块分配,...,由于这些实现由于可变块大小而受到碎片的影响,由于性能的原因,它们不可能在实时系统中使用它们.
"可变块大小如何导致碎片化"如何发生?固定大小的分配如何解决这个问题?这个维基描述对我来说听起来有点误导.我认为通过固定大小的分配或由可变大小引起的碎片不可避免.在内存池上下文中,特定应用程序的特定设计内存分配器可以避免碎片,或者通过限制使用预期的内存块来减少碎片.
同样通过几个实现示例,例如代码示例1和代码示例2,在我看来,使用内存池,开发人员必须非常好地了解数据类型,然后将数据剪切,拆分或组织到链接的内存中块(如果数据接近链表)或分层链接块(如果数据更加层次化,如文件).此外,开发人员似乎必须事先预测他需要多少内存.
好吧,我可以想象这适用于一系列原始数据.C++非原始数据类怎么样,内存模型不是很明显?即使对于原始数据,开发人员是否应该考虑数据类型对齐?
C和C++有好的内存池库吗?
谢谢你的评论!