“Python/docs/3.9/c-api/allocation”的版本间差异

来自菜鸟教程
Python/docs/3.9/c-api/allocation
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:在堆上分配对象 — Python 文档}}
 
<div id="allocating-objects-on-the-heap" class="section">
 
<div id="allocating-objects-on-the-heap" class="section">
  
 
<span id="allocating-objects"></span>
 
<span id="allocating-objects"></span>
= Allocating Objects on the Heap =
+
= 在堆上分配对象 =
  
; [[../structures#c|PyObject]] *<code>_PyObject_New</code><span class="sig-paren">(</span>[[../type#c|PyTypeObject]] *''type''<span class="sig-paren">)</span>
+
; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">_PyObject_New</span></span></span><span class="sig-paren">(</span>[[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br />
: ''Return value: New reference.''
 
  
; [[../structures#c|PyVarObject]] *<code>_PyObject_NewVar</code><span class="sig-paren">(</span>[[../type#c|PyTypeObject]] *''type'', Py_ssize_t ''size''<span class="sig-paren">)</span>
+
:  
: ''Return value: New reference.''
 
  
<dl>
+
; [[../structures#c|<span class="n"><span class="pre">PyVarObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">_PyObject_NewVar</span></span></span><span class="sig-paren">(</span>[[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, <span class="n"><span class="pre">Py_ssize_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span><span class="sig-paren">)</span><br />
<dt>[[../structures#c|PyObject]] *<code>PyObject_Init</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''op'', [[../type#c|PyTypeObject]] *''type''<span class="sig-paren">)</span></dt>
 
<dd><p>''Return value: Borrowed reference.''</p>
 
<p>Initialize a newly-allocated object ''op'' with its type and initial
 
reference. Returns the initialized object. If ''type'' indicates that the
 
object participates in the cyclic garbage detector, it is added to the
 
detector's set of observed objects. Other fields of the object are not
 
affected.</p></dd></dl>
 
  
<dl>
+
:  
<dt>[[../structures#c|PyVarObject]] *<code>PyObject_InitVar</code><span class="sig-paren">(</span>[[../structures#c|PyVarObject]] *''op'', [[../type#c|PyTypeObject]] *''type'', Py_ssize_t ''size''<span class="sig-paren">)</span></dt>
 
<dd><p>''Return value: Borrowed reference.''</p>
 
<p>This does everything [[#c.PyObject_Init|<code>PyObject_Init()</code>]] does, and also initializes the
 
length information for a variable-size object.</p></dd></dl>
 
  
<dl>
+
; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyObject_Init</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">op</span></span>, [[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br />
<dt>TYPE *<code>PyObject_New</code><span class="sig-paren">(</span>TYPE, [[../type#c|PyTypeObject]] *''type''<span class="sig-paren">)</span></dt>
 
<dd><p>''Return value: New reference.''</p>
 
<p>Allocate a new Python object using the C structure type ''TYPE'' and the
 
Python type object ''type''. Fields not defined by the Python object header
 
are not initialized; the object's reference count will be one. The size of
 
the memory allocation is determined from the [[../typeobj#c.PyTypeObject|<code>tp_basicsize</code>]] field of
 
the type object.</p></dd></dl>
 
  
<dl>
+
: 使用其类型和初始引用初始化新分配的对象 ''op''。 返回初始化的对象。 如果 ''type'' 指示对象参与循环垃圾检测器,则将其添加到检测器的观察对象集中。 对象的其他字段不受影响。
<dt>TYPE *<code>PyObject_NewVar</code><span class="sig-paren">(</span>TYPE, [[../type#c|PyTypeObject]] *''type'', Py_ssize_t ''size''<span class="sig-paren">)</span></dt>
 
<dd><p>''Return value: New reference.''</p>
 
<p>Allocate a new Python object using the C structure type ''TYPE'' and the
 
Python type object ''type''. Fields not defined by the Python object header
 
are not initialized. The allocated memory allows for the ''TYPE'' structure
 
plus ''size'' fields of the size given by the [[../typeobj#c.PyTypeObject|<code>tp_itemsize</code>]] field of
 
''type''. This is useful for implementing objects like tuples, which are
 
able to determine their size at construction time. Embedding the array of
 
fields into the same allocation decreases the number of allocations,
 
improving the memory management efficiency.</p></dd></dl>
 
  
; void <code>PyObject_Del</code><span class="sig-paren">(</span>void *''op''<span class="sig-paren">)</span>
+
; [[../structures#c|<span class="n"><span class="pre">PyVarObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyObject_InitVar</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyVarObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">op</span></span>, [[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, <span class="n"><span class="pre">Py_ssize_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span><span class="sig-paren">)</span><br />
: Releases memory allocated to an object using [[#c.PyObject_New|<code>PyObject_New()</code>]] or [[#c.PyObject_NewVar|<code>PyObject_NewVar()</code>]]. This is normally called from the [[../typeobj#c.PyTypeObject|<code>tp_dealloc</code>]] handler specified in the object's type. The fields of the object should not be accessed after this call as the memory is no longer a valid Python object.
 
  
; [[../structures#c|PyObject]] <code>_Py_NoneStruct</code>
+
: 这完成了 [[#c.PyObject_Init|PyObject_Init()]] 所做的一切,并且还初始化了可变大小对象的长度信息。
: Object which is visible in Python as <code>None</code>. This should only be accessed using the [[../none#c|<code>Py_None</code>]] macro, which evaluates to a pointer to this object.
+
 
 +
; <span class="n"><span class="pre">TYPE</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyObject_New</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">TYPE</span></span>, [[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br />
 +
 
 +
: 使用 C 结构类型 ''TYPE'' 和 Python 类型对象 ''type'' 分配一个新的 Python 对象。 Python 对象头未定义的字段不会被初始化; 对象的引用计数将为 1。 内存分配的大小由类型对象的 [[../typeobj#c.PyTypeObject|tp_basicsize]] 字段确定。
 +
 
 +
; <span class="n"><span class="pre">TYPE</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyObject_NewVar</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">TYPE</span></span>, [[../type#c|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, <span class="n"><span class="pre">Py_ssize_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span><span class="sig-paren">)</span><br />
 +
 
 +
: 使用 C 结构类型 ''TYPE'' 和 Python 类型对象 ''type'' 分配一个新的 Python 对象。 Python 对象标头未定义的字段不会被初始化。 分配的内存允许 ''TYPE'' 结构加上 ''size'' 字段,其大小由 ''type'' 的 [[../typeobj#c.PyTypeObject|tp_itemsize]] 字段给出。 这对于实现像元组这样的对象很有用,这些对象能够在构建时确定它们的大小。 将字段数组嵌入到同一分配中减少了分配次数,提高了内存管理效率。
 +
 
 +
; <span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyObject_Del</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">op</span></span><span class="sig-paren">)</span><br />
 +
 
 +
: 使用 [[#c.PyObject_New|PyObject_New()]] 或 [[#c.PyObject_NewVar|PyObject_NewVar()]] 释放分配给对象的内存。 这通常从对象类型中指定的 [[../typeobj#c.PyTypeObject|tp_dealloc]] 处理程序调用。 在此调用之后不应访问对象的字段,因为内存不再是有效的 Python 对象。
 +
 
 +
; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">_Py_NoneStruct</span></span></span><br />
 +
 
 +
: Python 中可见的对象为 <code>None</code>。 这应该只能使用 [[../none#c|Py_None]] 宏访问,该宏的计算结果为指向此对象的指针。
  
 
<div class="admonition seealso">
 
<div class="admonition seealso">
  
参见
+
也可以看看
  
 
; [[../module#c|<code>PyModule_Create()</code>]]
 
; [[../module#c|<code>PyModule_Create()</code>]]
: To allocate and create extension modules.
+
: 分配和创建扩展模块。
 +
 
  
 +
</div>
  
 
</div>
 
</div>
 +
<div class="clearer">
 +
 +
  
 
</div>
 
</div>
  
[[Category:Python 3.9 中文文档]]
+
[[Category:Python 3.9 文档]]

2021年10月31日 (日) 04:49的最新版本

在堆上分配对象

PyObject *_PyObject_New(PyTypeObject *type)
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
使用其类型和初始引用初始化新分配的对象 op。 返回初始化的对象。 如果 type 指示对象参与循环垃圾检测器,则将其添加到检测器的观察对象集中。 对象的其他字段不受影响。
PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
这完成了 PyObject_Init() 所做的一切,并且还初始化了可变大小对象的长度信息。
TYPE *PyObject_New(TYPE, PyTypeObject *type)
使用 C 结构类型 TYPE 和 Python 类型对象 type 分配一个新的 Python 对象。 Python 对象头未定义的字段不会被初始化; 对象的引用计数将为 1。 内存分配的大小由类型对象的 tp_basicsize 字段确定。
TYPE *PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)
使用 C 结构类型 TYPE 和 Python 类型对象 type 分配一个新的 Python 对象。 Python 对象标头未定义的字段不会被初始化。 分配的内存允许 TYPE 结构加上 size 字段,其大小由 typetp_itemsize 字段给出。 这对于实现像元组这样的对象很有用,这些对象能够在构建时确定它们的大小。 将字段数组嵌入到同一分配中减少了分配次数,提高了内存管理效率。
void PyObject_Del(void *op)
使用 PyObject_New()PyObject_NewVar() 释放分配给对象的内存。 这通常从对象类型中指定的 tp_dealloc 处理程序调用。 在此调用之后不应访问对象的字段,因为内存不再是有效的 Python 对象。
PyObject _Py_NoneStruct
在 Python 中可见的对象为 None。 这应该只能使用 Py_None 宏访问,该宏的计算结果为指向此对象的指针。

也可以看看

PyModule_Create()
分配和创建扩展模块。