gpt4 book ai didi

python - 对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?

转载 作者:太空狗 更新时间:2023-10-29 21:02:33 27 4
gpt4 key购买 nike

我正在研究用于定义新类型的 Python C 扩展文档,并且刚刚完成了 Providing finer control over data attributes部分。

在本节中,他们更改了示例代码以确保 Noddy 结构的 firstlast 属性永远不会是 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 的优势在于:

  • 速度更快,因为它避免了不必要的测试和跳转;
  • 它向(人类)读者发出信号,表明指针在释放时预计为非 NULL;
  • 它提供了一个有效的零成本断言,即指针为非 NULL - 如果不变量被破坏,程序可能会立即崩溃。¹

在处理低级代码时,这些要点可能很重要,这就是为什么 Python 核心和大多数扩展都小心地只使用 Py_XDECREF(或 Py_CLEARtp_clear) 当指针实际上可以为 NULL 时。

¹ 从技术上讲,它是未定义的行为,这意味着无法保证崩溃与实际断言的方式相同。然而,在实践中,编译器别无选择,只能生成取消引用指针的代码,如果指针为 NULL,这将导致内存错误。

关于python - 对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com