【问题标题】:What does ob_size reprensents in the structure of long integer?ob_size 在长整数结构中代表什么?
【发布时间】:2020-12-16 02:02:33
【问题描述】:

整数(长)类型定义实际上如下所示(一旦 C 宏展开):

struct _longobject {
  long ob_refcnt;
  PyTypeObject *ob_type;
  size_t ob_size;
  uint32_t ob_digit[1];
  };

这里,ob_size是什么意思,它的值代表什么?

【问题讨论】:

  • stackoverflow.com/questions/37932600/… 不是完整的答案,但这里是关于 cython size_t 实现差异的讨论。
  • 你看source了吗?短版:ob_size 的绝对值是 30 位或 15 位(取决于构建)位数; ob_size 的符号是整数的符号。
  • (我删除了 NumPy 和 Pandas 标签;它们在这里不相关 - 这是一个关于纯 CPython 的问题,并且 NumPy 整数类型有自己的实现,不需要 ob_size字段。)
  • 我还是看不懂!

标签: python cpython


【解决方案1】:

Python _longobject (A.K.A. int) 是可变大小的,它是可变对象的标准 Python 标头。来自object.h:

/* PyObject_VAR_HEAD defines the initial segment of all variable-size
 * container objects.  These end with a declaration of an array with 1
 * element, but enough space is malloc'ed so that the array actually
 * has room for ob_size elements.  Note that ob_size is an element count,
 * not necessarily a byte count.
 */

_longobject 分配在堆上的一个足够大的内存块以容纳long ob_digit[ob_size] 长整数。

【讨论】:

  • 所以对象的值存储在 ob_digit[ob_size] 中,但是为什么它们存储在数组中,因为它是单个值?
  • @SachinSharma - 有趣的是,它不是。 Python 整数可以增长到任意大小。如果你创建的整数溢出ob_digit[1],python 会分配更大的空间以使其适合。
  • 假设数组的大小是2,那么大的值怎么存储呢?将数字的半二进制表示存储在一个块中并保留在另一个块中,还是有另一种存储值的方法?
  • @SachinSharma:差不多,是的:数字绝对值的二进制表示被分成 30 位块,其中一个 30 位块存储在每个 uint32_t"数字”。第一个数字 (x->ob_digit[0]) 具有最低 30 位;下一个数字具有位 30 到 59,依此类推。所以一个 128 位的数字需要 5 个“数字”的数组。它只是表示整数的常用基本系统,只是这里的基数是2^30。 (技术说明:某些版本/平台可能使用 15 位而不是 30 位。)
  • @MarkDickinson - 感谢您提供详细信息。
猜你喜欢
  • 2014-06-20
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多