gpt4 book ai didi

python - _PyString_Resize 是否重新分配内存?

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:29 24 4
gpt4 key购买 nike

我正在开发一个 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 是做什么的呢?有没有一种简单的方法可以控制这种行为?

最佳答案

是的,_PyString_Resize 执行realloc - 毕竟,这是您要求它执行的操作:-)

如果你想保存重新分配,也许你可以读取到堆栈上的缓冲区,然后从中创建字符串对象。类似(未编译和测试,因此将其视为伪代码):

char cbuf[BUFFER_SIZE];
int sz = read(cbuf, BUFFER_SIZE);
PyObject * buffer = PyString_FromStringAndSize(cbuf, sz);

另外,请注意 _PyString_Resize 实现上方的警告(在 Objects/stringobject.c 中):

The following function breaks the notion that strings are immutable:
it changes the size of a string. We get away with this only if there is only one module referencing the object. You can also think of itas creating a new string object and destroying the old one, only more efficiently. In any case, don't use this if the string may already be known to some other part of the code...

关于python - _PyString_Resize 是否重新分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5392657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com