“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> | ||
− | = | + | = 在堆上分配对象 = |
− | ; [[../structures#c|PyObject]] *< | + | ; [[../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 /> |
− | |||
− | + | : | |
− | : | ||
− | + | ; [[../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 /> | |
− | |||
− | < | ||
− | < | ||
− | |||
− | |||
− | |||
− | |||
− | + | : | |
− | |||
− | |||
− | |||
− | |||
− | < | + | ; [[../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 /> |
− | < | ||
− | < | ||
− | < | ||
− | |||
− | |||
− | |||
− | |||
− | + | : 使用其类型和初始引用初始化新分配的对象 ''op''。 返回初始化的对象。 如果 ''type'' 指示对象参与循环垃圾检测器,则将其添加到检测器的观察对象集中。 对象的其他字段不受影响。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ''type'' | ||
− | |||
− | |||
− | |||
− | ; | + | ; [[../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 /> |
− | |||
− | ; [[../structures#c|PyObject]] < | + | : 这完成了 [[#c.PyObject_Init|PyObject_Init()]] 所做的一切,并且还初始化了可变大小对象的长度信息。 |
− | : | + | |
+ | ; <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>]] | ||
− | : | + | : 分配和创建扩展模块。 |
+ | |||
+ | </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 字段,其大小由 type 的 tp_itemsize 字段给出。 这对于实现像元组这样的对象很有用,这些对象能够在构建时确定它们的大小。 将字段数组嵌入到同一分配中减少了分配次数,提高了内存管理效率。
- void PyObject_Del(void *op)
- 使用 PyObject_New() 或 PyObject_NewVar() 释放分配给对象的内存。 这通常从对象类型中指定的 tp_dealloc 处理程序调用。 在此调用之后不应访问对象的字段,因为内存不再是有效的 Python 对象。
- PyObject _Py_NoneStruct
- 在 Python 中可见的对象为
None
。 这应该只能使用 Py_None 宏访问,该宏的计算结果为指向此对象的指针。