答案是:不可知的。这就是embed python不如lua的地方,lua不仅可以通过collectgarbage("count")来得到占用内存
还可以传入自定义的lua_Alloc函数分配器:
lua_State *lua_newstate (lua_Alloc f, void *ud);
embed python只能去感知他占用的内存大小,比如在程序退出时,把自己的对象全部销毁了,剩下的大概就是python占用的内存。
如果就此止步不是我们的风格,我们直接重写malloc和free
int g_py_malloc = 0;
PyAPI_FUNC(int) py_get_memory_cost()
{return g_py_malloc;
}
void *py2_malloc(unsigned int num_bytes)
{void* p = malloc(num_bytes + 4);int* size = (int*)p;*size++ = num_bytes;g_py_malloc += num_bytes;return size;
}
void *py2_realloc(void* p,unsigned int num_bytes)
{int* size;int sz;if (p == 0)return py2_malloc(num_bytes);size = (int*)p;sz = *--size;p = realloc(size,num_bytes+4);size = (int*)p;*size++ = num_bytes;g_py_malloc += num_bytes - sz;return size;
}
void py2_free(void* p)
{int* size;if (p == 0)return;size = (int*)p;g_py_malloc -= *--size;free(size);
}
解释一下做法,就是多分配1个int在内存头记录分配的大小即可。
然后把python中的obmalloc.c 和 pymem.h中的malloc,realloc,free分别替换为新的,改动不大可以接受。注意:也许在多线程下有bug。