LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 280|回复: 0

缓冲区请求的类型

[复制链接]
发表于 2024-1-25 18:00:31 | 显示全部楼层 |阅读模式

通常,通过 PyObject_GetBuffer() 向输出对象发送缓冲区请求,即可获得缓冲区。由于内存的逻辑结构复杂,可能会有很大差异,缓冲区使用者可用 flags 参数指定其能够处理的缓冲区具体类型。
所有 Py_buffer 字段均由请求类型无歧义地定义。
与请求无关的字段
以下字段不会被 flags 影响,并且必须总是用正确的值填充:obj, buflenitemsizendim
只读,格式
[size=1.1em]PyBUF_WRITABLE
控制 readonly 字段。如果设置了,输出程序 必须 提供一个可写的缓冲区,否则报告失败。若未设置,输出程序 可以 提供只读或可写的缓冲区,但对所有消费者程序 必须 保持一致。
[size=1.1em]PyBUF_FORMAT
控制 format 字段。 如果设置,则必须正确填写此字段。其他情况下,此字段必须为 NULL。
PyBUF_WRITABLE 可以和下一节的所有标志联用。由于 PyBUF_SIMPLE 定义为 0,所以 PyBUF_WRITABLE 可以作为一个独立的标志,用于请求一个简单的可写缓冲区。
PyBUF_FORMAT 可以被设为除了 PyBUF_SIMPLE 之外的任何标志。 后者已经按暗示了 B (无符号字节串)格式。
形状,步幅,子偏移量
控制内存逻辑结构的标志按照复杂度的递减顺序列出。注意,每个标志包含它下面的所有标志。
[td]
请求
形状
步幅
子偏移量
[size=1.1em]PyBUF_INDIRECT
如果需要的话
[size=1.1em]PyBUF_STRIDES
NULL
[size=1.1em]PyBUF_ND
NULL
NULL
[size=1.1em]PyBUF_SIMPLE
NULL
NULL
NULL

连续性的请求
可以显式地请求C 或 Fortran 连续 ,不管有没有步幅信息。若没有步幅信息,则缓冲区必须是 C-连续的。
[td]
请求
形状
步幅
子偏移量
邻接
[size=1.1em]PyBUF_C_CONTIGUOUS
NULL
C
[size=1.1em]PyBUF_F_CONTIGUOUS
NULL
F
[size=1.1em]PyBUF_ANY_CONTIGUOUS
NULL
C 或 F
NULL
NULL
C

复合请求
所有可能的请求都由上一节中某些标志的组合完全定义。为方便起见,缓冲区协议提供常用的组合作为单个标志。
在下表中,U 代表连续性未定义。消费者程序必须调用 PyBuffer_IsContiguous() 以确定连续性。
[td]
请求
形状
步幅
子偏移量
邻接
只读
format
[size=1.1em]PyBUF_FULL
如果需要的话
U
0
[size=1.1em]PyBUF_FULL_RO
如果需要的话
U
1 或 0
[size=1.1em]PyBUF_RECORDS
NULL
U
0
[size=1.1em]PyBUF_RECORDS_RO
NULL
U
1 或 0
[size=1.1em]PyBUF_STRIDED
NULL
U
0
NULL
[size=1.1em]PyBUF_STRIDED_RO
NULL
U
1 或 0
NULL
[size=1.1em]PyBUF_CONTIG
NULL
NULL
C
0
NULL
[size=1.1em]PyBUF_CONTIG_RO
NULL
NULL
C
1 或 0
NULL


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表