我正在开发一个 Python C 扩展模块(用于 CPython 2.5)。它调用一些填充缓冲区的底层网络 API。
目前代码基本编写如下:
PyObject * buffer;
char * cbuf;
size_t buffer_size = 1024;
int sz;
buffer = PyString_FromStringAndSize(NULL, buffer_size);
if (buffer == NULL) return NULL;
cbuf = PyString_AsString(buffer);
Py_BEGIN_ALLOW_THREADS
sz = read(cbuf, buffer_size);
Py_END_ALLOW_THREADS
if (sz > 0 && sz != buffer_size && _PyString_Resize(&buffer, sz) < 0)
return NULL;
据我所知,这段代码运行良好,但我想知道_PyString_Resize
. 如果 sz 小于 buffer_size,它是否使用它重新分配内存的现有缓冲区?
从效率的角度来看,我可能更喜欢前者来避免缓冲区内容的无用副本,即使它消耗的内存比必要的多。另一方面,重新分配内存也可能有助于减少内存占用。
那么 _PyString_Resize 是做什么的呢?有没有一种简单的方法来控制这种行为?