对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?
Is there any benefit to using Py_DECREF instead of Py_XDECREF for Python C Extensions?
我正在研究用于定义新类型的 Python C 扩展文档,刚刚完成 Providing finer control over data attributes 部分。
在本节中,他们更改了示例代码以确保 Noddy
结构的 first
和 last
属性永远不会是 NULL
,例如通过将 new
中的属性初始化为空字符串,并添加 getter 和 setter,如果用户尝试删除或以其他方式将这些属性设置为 Null,则会引发 TypeError
。
此外(以及我的问题的重点),作者将这些属性的所有 Py_XDECREF
更改为 Py_DECREF
,声明:
With these changes, we can assure that the first and last members are never NULL so we can remove checks for NULL values in almost all cases. This means that most of the Py_XDECREF() calls can be converted to Py_DECREF() calls. The only place we can’t change these calls is in the deallocator, where there is the possibility that the initialization of these members failed in the constructor.
在我看来,使用 Py_XDECREF
会更安全,因为如果 Py_DECREF
传递了 NULL
值,则会导致 segmentation fault
。
使用 Py_DECREF
比 Py_XDECREF
有什么好处?
如果您知道对象不能为 NULL,那么 Py_DECREF
相对于 Py_XDECREF
的好处是:
- 速度更快,因为它避免了不必要的测试和跳转;
- 它向(人类)reader 发出信号,指示指针预计在释放点 non-NULL;
- 它提供了一个有效的 zero-cost 断言,即指针是 non-NULL - 如果不变量被破坏,程序可能会立即崩溃。¹
这些要点在处理 low-level 代码时可能很重要,这就是为什么 Python 核心和大多数扩展都小心地只使用 Py_XDECREF
(或 Py_CLEAR
tp_clear
) 当指针实际上可以为 NULL 时。
¹ 从技术上讲,它是 未定义的行为 ,这意味着无法保证崩溃与实际断言的方式相同。然而,在实践中,编译器别无选择,只能生成取消引用指针的代码,如果指针为 NULL,则会导致内存错误。
我正在研究用于定义新类型的 Python C 扩展文档,刚刚完成 Providing finer control over data attributes 部分。
在本节中,他们更改了示例代码以确保 Noddy
结构的 first
和 last
属性永远不会是 NULL
,例如通过将 new
中的属性初始化为空字符串,并添加 getter 和 setter,如果用户尝试删除或以其他方式将这些属性设置为 Null,则会引发 TypeError
。
此外(以及我的问题的重点),作者将这些属性的所有 Py_XDECREF
更改为 Py_DECREF
,声明:
With these changes, we can assure that the first and last members are never NULL so we can remove checks for NULL values in almost all cases. This means that most of the Py_XDECREF() calls can be converted to Py_DECREF() calls. The only place we can’t change these calls is in the deallocator, where there is the possibility that the initialization of these members failed in the constructor.
在我看来,使用 Py_XDECREF
会更安全,因为如果 Py_DECREF
传递了 NULL
值,则会导致 segmentation fault
。
使用 Py_DECREF
比 Py_XDECREF
有什么好处?
如果您知道对象不能为 NULL,那么 Py_DECREF
相对于 Py_XDECREF
的好处是:
- 速度更快,因为它避免了不必要的测试和跳转;
- 它向(人类)reader 发出信号,指示指针预计在释放点 non-NULL;
- 它提供了一个有效的 zero-cost 断言,即指针是 non-NULL - 如果不变量被破坏,程序可能会立即崩溃。¹
这些要点在处理 low-level 代码时可能很重要,这就是为什么 Python 核心和大多数扩展都小心地只使用 Py_XDECREF
(或 Py_CLEAR
tp_clear
) 当指针实际上可以为 NULL 时。
¹ 从技术上讲,它是 未定义的行为 ,这意味着无法保证崩溃与实际断言的方式相同。然而,在实践中,编译器别无选择,只能生成取消引用指针的代码,如果指针为 NULL,则会导致内存错误。