私は 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 が行うのはどれですか? そして、この種の振る舞いを制御する簡単な方法はありますか?