[PyQt] operator new/delete and PyMem_New/Del
Giovanni Bajo
rasky at develer.com
Wed Jun 4 19:05:18 BST 2008
On 6/4/2008 7:42 PM, Kevin Watters wrote:
> I was profiling my SIP extension, seeing that I allocate lots and lots
> of a certain class of small objects, whose ownership is never
> transferred to C++. I remembered reading a section from the Python C API
> manual on memory management, here:
>
> http://docs.python.org/api/memoryOverview.html -- the relevant bit is:
>
> "In most situations, however, it is recommended to allocate memory
> from the Python heap specifically because the latter is under control
> of the Python memory manager. For example, this is required when the
> interpreter is extended with new object types written in C. Another
> reason for using the Python heap is the desire to inform the Python
> memory manager about the memory needs of the extension module. Even
> when the requested memory is used exclusively for internal,
> highly-specific purposes, delegating all memory requests to the
> Python memory manager causes the interpreter to have a more accurate
> image of its memory footprint as a whole. Consequently, under certain
> circumstances, the Python memory manager may or may not trigger
> appropriate actions, like garbage collection, memory compaction or
> other preventive procedures. Note that by using the C library
> allocator as shown in the previous example, the allocated memory for
> the I/O buffer escapes completely the Python memory manager."
>
> Overriding operator new and operator delete in SIP's generated code for
> this class with the PyMem_New and PyMem_Delete functions would
> effectively accomplish what that passage is talking about.
>
> This might, of course, be pointless, without more detailed profiling.
> But I was wondering if anyone had an experience trying anything like
> this this in extensions of their own.
Yes, we do. We use this code:
#include <Python.h>
struct PyMallocObject
{
static void* operator new (size_t n)
{
return PyObject_Malloc(n);
}
static void* operator new (size_t n, void *p)
{
return ::operator new(n, p);
}
static void operator delete(void *p, size_t)
{
PyObject_Free(p);
}
static void operator delete(void *p, void *a)
{
return ::operator delete(p, a);
}
};
You just inherit the small objects from this class and you're done with.
If you do many allocations, this should be a win over the standard
new/delete.
--
Giovanni Bajo
Develer S.r.l.
http://www.develer.com
More information about the PyQt
mailing list