- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在研究用于定义新类型的 Python C 扩展文档,并且刚刚完成了 Providing finer control over data attributes部分。
在本节中,他们更改了示例代码以确保 Noddy
结构的 first
和 last
属性永远不会是 NULL
,例如,通过在 new
中将属性初始化为空字符串,并添加 getter 和 setter,如果用户尝试删除或以其他方式设置这些属性,则会引发 TypeError
属性为 Null。
此外(也是我的问题的重点),作者将这些属性的所有 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
值。
使用 Py_DECREF
而不是 Py_XDECREF
有什么好处?
最佳答案
如果您知道对象不能为 NULL,Py_DECREF
相对于 Py_XDECREF
的优势在于:
在处理低级代码时,这些要点可能很重要,这就是为什么 Python 核心和大多数扩展都小心地只使用 Py_XDECREF
(或 Py_CLEAR
在 tp_clear
) 当指针实际上可以为 NULL 时。
¹ 从技术上讲,它是未定义的行为,这意味着无法保证崩溃与实际断言的方式相同。然而,在实践中,编译器别无选择,只能生成取消引用指针的代码,如果指针为 NULL,这将导致内存错误。
关于python - 对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915305/
我正在研究用于定义新类型的 Python C 扩展文档,并且刚刚完成了 Providing finer control over data attributes部分。 在本节中,他们更改了示例代码以确
我是一名优秀的程序员,十分优秀!