模块契约FixedStack、PtrFixedStack、Stack、BlockStack 与 PtrStack

错误与原子性

场景错误种类
空结构、空来源、零元素大小或无效外部缓冲XERR_ARGUMENT
公开结构摘要损坏XERR_STATE
空栈访问、尺寸乘法或容量取整溢出XERR_RANGE
固定栈容量已满XERR_AGAIN
创建、预留、连续扩容或新块分配失败XERR_MEMORY

所有失败操作都保持原有深度和已有元素。BlockStack 的 Reserve 还保证失败时不保留部分数据块。成功和正常状态查询不会主动清除调用前已有错误。

裁剪与依赖

能力宏依赖
固定容量栈XRT_FEATURE_FIXED_STACKcore
固定容量指针栈XRT_FEATURE_PTR_FIXED_STACKfixed_stack
动态栈XRT_FEATURE_STACKarray
稳定地址分块栈XRT_FEATURE_BLOCK_STACKarray
指针栈XRT_FEATURE_PTR_STACKstack

固定栈不依赖动态数组。只需要本地有界工作栈时,不会带入任何扩容代码。 BlockStack 与连续 Stack 可分别裁剪;两者都只复用 Array 的块索引或连续存储底座。 启用 ptr_stack 必须同时启用 stack 和 array,公共头会拒绝所有不完整依赖。

共同契约

  • 栈顶是最后压入的元素,Push、Top、Pop 均为 O(1) 摊销操作;固定栈始终为 O(1)。
  • Push 浅复制一个完整元素;Add 返回未初始化新槽,调用方必须立即写满。
  • Get(index) 使用统一的 0 基栈底索引;Peek(depth) 从栈顶计数,depth == 0 等价于 Top。
  • Top、Get 和 Peek 返回栈内借用地址。FixedStack 地址在生命周期内稳定;连续 Stack 扩容可能移动全部元素;BlockStack 的活动元素在 Push、Pop 和 Reserve 后仍保持地址稳定。
  • Pop 把值复制到外部缓冲后再删除,不返回失活槽地址。输出可以为 NULL,表示只删除栈顶;输出不得与同一栈的存储区重叠。FixedStack 和连续 Stack 会主动检查这一条件;BlockStack 的低成本前置条件见其专节。
  • 容器只管理元素字节。结构体中的指针、句柄和其他资源仍由调用方管理。
  • 空栈 Top 或 Pop 返回失败并设置 XERR_RANGE。固定栈已满时 Add 或 Push 设置 XERR_AGAIN,且原栈不变。
  • 容器不隐式加锁。一个栈同时只能由一个执行流修改;跨线程共享时使用外部同步。

PtrFixedStack

Init 直接借用调用方的 ptr[],容量参数使用元素数量而不是字节数。指针数组不得与栈结构本身重叠。整个生命周期可以完全不分配内存,适合固定上限的资源回滚、清理动作和句柄栈。Create 则复用 FixedStack 的拥有型固定缓冲。

PtrFixedStack 只保存指针值,不拥有目标。它允许保存合法 NULL; 此时 Get、Peek 或 Top 返回 NULL 且不设置新错误,空栈或越界则设置 XERR_RANGE。 需要区分合法空值与失败时,应在读取前清除旧错误,再检查本次调用后的错误状态; 已知索引小于公开 Count 时,返回的 NULL 就是合法值。 所有入口都会拒绝元素宽度不是 sizeof(ptr) 的 FixedStack, 避免旧版“在更宽结构体前几个字节写入指针”的隐式布局。

PtrStack

指针栈允许保存合法 NULL。此时 Top 返回 NULL 但不会设置新错误; 空栈也返回 NULL,同时设置 XERR_RANGE。 需要无歧义处理时,在调用前清除错误并检查 xrtGetError(),或直接使用 Count。

Pop 返回布尔结果,因此能无歧义弹出空指针。输出参数可以为空,表示丢弃栈顶。清空、弹出和销毁都不会释放指针目标。 类型化入口会检查底层连续栈确实使用 sizeof(ptr) 元素,并直接复用已验证的 Array 增长原语;因此 Push 不需要通用字节复制和来源别名分析。分配失败保持 地址、深度、容量和已有指针值不变。Pop 继续复用通用栈的输出别名检查, 若输出指向自身存储区则设置 XERR_ARGUMENT 且不删除栈顶。

xfixedstack类型

固定栈可借用外部缓冲,也可拥有创建时分配的固定缓冲。

字段类型语义
Databytes数据
AllocationptrAllocation
ItemSizesize_t单元素字节数
Countsize_t数量
Capacitysize_t容量
typedef struct xfixedstack { bytes Data; ptr Allocation; size_t ItemSize; size_t Count; size_t Capacity; } xfixedstack;

xblockstack类型

* 分块栈只移动块索引,不移动块内元素。 * Blocks 的元素类型属于内部实现,调用方只能读取其 Count 和 Capacity 做诊断。

字段类型语义
BlocksxarrayBlocks
ItemSizesize_t单元素字节数
Countsize_t数量
Capacitysize_t容量
BlockItemssize_tBlockItems
Alignmentsize_t对齐(二次幂)
typedef struct xblockstack { xarray Blocks; size_t ItemSize; size_t Count; size_t Capacity; size_t BlockItems; size_t Alignment; } xblockstack;

xptrfixedstack类型

固定指针栈只保存指针值,不拥有指针指向的对象。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef xfixedstack xptrfixedstack;

xstack类型

动态栈复用连续数组存储,结构性修改可能改变元素地址。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef xarray xstack;

xptrstack类型

指针栈只保存指针值,不拥有指针指向的对象。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef xstack xptrstack;
LIFO 操作

xrtFixedStackInit函数

在不与栈结构重叠的调用方缓冲上初始化固定容量栈。

bool xrtFixedStackInit(xfixedstack* pStack, ptr pMemory, size_t iMemorySize, size_t iItemSize)

参数

参数方向约束说明
pStack输出非空接收栈
pMemory输入非空、不与栈重叠元素缓冲
iMemorySize输入足够容纳容量缓冲字节数
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
true已初始化—
false布局参数非法XERR_ARGUMENT / XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 缓冲尺寸与元素大小不匹配

范例已编译验证

fixed · 外部缓冲初始化

	if ( !xrtFixedStackInit(&tFrames, pStorage, sizeof(pStorage), sizeof(exampleframe)) ) {

xrtFixedStackCreate函数

创建拥有固定容量缓冲的栈。

xfixedstack* xrtFixedStackCreate(size_t iCapacity, size_t iItemSize)

参数

参数方向约束说明
iCapacity输入> 0元素容量
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
非空栈(含缓冲)—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 堆创建

		xfixedstack* pFixed = xrtFixedStackCreate(4u, sizeof(int));

xrtFixedStackUnit函数

释放创建时取得的固定缓冲,但不释放栈结构。

void xrtFixedStackUnit(xfixedstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无缓冲已释放—
错误
  • 无 — 释放不失败

范例已编译验证

fixed · 释放缓冲

	xrtFixedStackUnit(&tFrames);

xrtFixedStackDestroy函数

释放固定缓冲和创建的栈结构。

void xrtFixedStackDestroy(xfixedstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无栈已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

tour · 销毁

		xrtFixedStackDestroy(pFixed);

xrtFixedStackClear函数

清空栈内容并保留固定容量。

void xrtFixedStackClear(xfixedstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
无已清空—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 清空

		xrtFixedStackClear(pFixed);

xrtFixedStackSpace函数

返回剩余可压入元素数量。

size_t xrtFixedStackSpace(const xfixedstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
>= 0剩余容量—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 剩余容量

		iSpace = xrtFixedStackSpace(pFixed);

xrtFixedStackGet函数

返回指定 0 基位置的可写元素借用地址。

ptr xrtFixedStackGet(xfixedstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取写

		(void)xrtFixedStackGet(pFixed, 0u);

xrtFixedStackConstGet函数

返回指定 0 基位置的只读元素借用地址。

const void* xrtFixedStackConstGet(const xfixedstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取读

		(void)xrtFixedStackConstGet(pFixed, 0u);

xrtFixedStackAdd函数

取得一个未初始化栈顶槽,栈满时失败。

ptr xrtFixedStackAdd(xfixedstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
非空未初始化栈顶槽—
NULL栈满或参数非法XERR_AGAIN / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_AGAIN — 固定容量已满

范例已编译验证

tour · 取得栈顶槽

		pSlot = (int*)xrtFixedStackAdd(pFixed);

xrtFixedStackPush函数

复制一个元素压入固定栈。

bool xrtFixedStackPush(xfixedstack* pStack, const void* pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输入非空要压入的元素
返回值
返回含义失败时状态
true已压入—
false栈满或参数非法XERR_AGAIN / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_AGAIN — 固定容量已满

范例已编译验证

fixed · 复制压入

		if ( !xrtFixedStackPush(&tFrames, &pInput[i]) ) {

xrtFixedStackPop函数

弹出栈顶元素,并可把内容复制到外部输出缓冲。

bool xrtFixedStackPop(xfixedstack* pStack, ptr pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输出允许空;不与栈重叠接收弹出的元素
返回值
返回含义失败时状态
true已弹出—
false栈空或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

fixed · 弹出

	while ( xrtFixedStackPop(&tFrames, &tFrame) ) {

xrtFixedStackPeek函数

返回距栈顶指定深度的可写元素,深度 0 表示栈顶。

ptr xrtFixedStackPeek(xfixedstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取写

		(void)xrtFixedStackPeek(pFixed, 0u);

xrtFixedStackConstPeek函数

返回距栈顶指定深度的只读元素,深度 0 表示栈顶。

const void* xrtFixedStackConstPeek(const xfixedstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取读

			const int* pPeek = (const int*)xrtFixedStackConstPeek(pFixed, 1u);

xrtFixedStackTop函数

返回可写栈顶元素借用地址。

ptr xrtFixedStackTop(xfixedstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶写

			int* pTop = (int*)xrtFixedStackTop(pFixed);

xrtFixedStackConstTop函数

返回只读栈顶元素借用地址。

const void* xrtFixedStackConstTop(const xfixedstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶读

		(void)xrtFixedStackConstTop(pFixed);
PtrFixedStack

xrtPtrFixedStackInit函数

在不与栈结构重叠的调用方指针数组上初始化固定容量指针栈。

bool xrtPtrFixedStackInit(xptrfixedstack* pStack, ptr* pMemory, size_t iCapacity)

参数

参数方向约束说明
pStack输出非空接收栈
pMemory输入非空指针槽数组
iCapacity输入> 0槽数
返回值
返回含义失败时状态
true已初始化—
false参数非法或溢出XERR_ARGUMENT / XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量尺寸溢出

范例已编译验证

pfixed · 外部数组初始化

	if ( !xrtPtrFixedStackInit(&tCleanup, pStorage, 4) ) {

xrtPtrFixedStackCreate函数

创建拥有指定固定容量的指针栈。

xptrfixedstack* xrtPtrFixedStackCreate(size_t iCapacity)

参数

参数方向约束说明
iCapacity输入> 0槽数
返回值
返回含义失败时状态
非空指针栈—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 堆创建

		xptrfixedstack* pPtr = xrtPtrFixedStackCreate(4u);

xrtPtrFixedStackUnit函数

释放拥有的指针存储区,但不释放任何指针目标或栈结构。

void xrtPtrFixedStackUnit(xptrfixedstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无存储已释放—
错误
  • 无 — 释放不失败

范例已编译验证

pfixed · 释放存储

			xrtPtrFixedStackUnit(&tCleanup);

xrtPtrFixedStackDestroy函数

释放创建的指针栈结构,但不释放任何指针目标。

void xrtPtrFixedStackDestroy(xptrfixedstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无栈已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

tour · 销毁

		xrtPtrFixedStackDestroy(pPtr);

xrtPtrFixedStackClear函数

清空固定指针栈,但不释放任何指针目标。

void xrtPtrFixedStackClear(xptrfixedstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
无已清空—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 清空

		xrtPtrFixedStackClear(pPtr);

xrtPtrFixedStackSpace函数

返回固定指针栈剩余容量。

size_t xrtPtrFixedStackSpace(const xptrfixedstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
>= 0剩余容量—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 剩余容量

		printf("ptrfixed: space=%zu", xrtPtrFixedStackSpace(pPtr));

xrtPtrFixedStackGet函数

返回指定 0 基位置的指针值。

ptr xrtPtrFixedStackGet(const xptrfixedstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
指针值存储的值(可为空值)—
NULL越界XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取值

		(void)xrtPtrFixedStackGet(pPtr, 0u);

xrtPtrFixedStackPush函数

压入一个可为空的指针值。

bool xrtPtrFixedStackPush(xptrfixedstack* pStack, ptr pValue)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pValue输入任意值要压入的指针
返回值
返回含义失败时状态
true已压入—
false栈满或参数非法XERR_AGAIN / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_AGAIN — 固定容量已满

范例已编译验证

pfixed · 压入

		if ( !xrtPtrFixedStackPush(&tCleanup, &pResources[i]) ) {

xrtPtrFixedStackPop函数

弹出指针值;输出为空表示只删除栈顶。

bool xrtPtrFixedStackPop(xptrfixedstack* pStack, ptr* pValue)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pValue输出允许空接收弹出的值
返回值
返回含义失败时状态
true已弹出—
false栈空或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

pfixed · 弹出

	while ( xrtPtrFixedStackPop(&tCleanup, &pResource) ) {

xrtPtrFixedStackPeek函数

返回距栈顶指定深度的指针值,深度 0 表示栈顶。

ptr xrtPtrFixedStackPeek(const xptrfixedstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
指针值存储的值(可为空值)—
NULL越界XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取值

		(void)xrtPtrFixedStackPeek(pPtr, 0u);

xrtPtrFixedStackTop函数

返回栈顶指针值;合法空值与错误通过错误状态区分。

ptr xrtPtrFixedStackTop(const xptrfixedstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
指针值栈顶值(可为合法空值)—
NULL栈空XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶值

		(void)xrtPtrFixedStackTop(pPtr);
LIFO 操作

xrtStackInit函数

初始化使用默认对齐的空动态栈。

bool xrtStackInit(xstack* pStack, size_t iItemSize)

参数

参数方向约束说明
pStack输出非空接收栈
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
true已初始化—
false布局参数非法见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

cstack · 默认初始化

	if ( !xrtStackInit(&tValues, sizeof(int)) ) {

xrtStackInitAligned函数

初始化显式过对齐动态栈。

bool xrtStackInitAligned(xstack* pStack, size_t iItemSize, size_t iAlignment)

参数

参数方向约束说明
pStack输出非空接收栈
iItemSize输入> 0元素字节数
iAlignment输入二次幂元素对齐
返回值
返回含义失败时状态
true已初始化—
false布局参数非法见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 对齐初始化

		if ( !xrtStackInitAligned(&Aligned, sizeof(int), 4u) ) {

xrtStackCreate函数

创建使用默认对齐的空动态栈。

xstack* xrtStackCreate(size_t iItemSize)

参数

参数方向约束说明
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
非空栈—
NULL创建失败见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 堆创建

		xstack* pStack = xrtStackCreate(sizeof(int));

xrtStackCreateAligned函数

创建显式过对齐动态栈。

xstack* xrtStackCreateAligned(size_t iItemSize, size_t iAlignment)

参数

参数方向约束说明
iItemSize输入> 0元素字节数
iAlignment输入二次幂元素对齐
返回值
返回含义失败时状态
非空栈—
NULL创建失败见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 堆创建(对齐)

		xrtStackDestroy(xrtStackCreateAligned(sizeof(int), 4u));

xrtStackUnit函数

释放动态栈元素内存,但不释放栈结构。

void xrtStackUnit(xstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无元素内存已释放—
错误
  • 无 — 释放不失败

范例已编译验证

cstack · 释放元素内存

			xrtStackUnit(&tValues);

xrtStackDestroy函数

释放动态栈全部资源和栈结构。

void xrtStackDestroy(xstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无栈已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

tour · 销毁

		xrtStackDestroy(pStack);

xrtStackClear函数

清空动态栈并保留容量。

void xrtStackClear(xstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
无已清空—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 清空

		(void)xrtStackClear(pStack);

xrtStackReserve函数

保证动态栈至少具有指定元素容量。

bool xrtStackReserve(xstack* pStack, size_t iCapacity)

参数

参数方向约束说明
pStack输入/输出非空目标栈
iCapacity输入—期望容量
返回值
返回含义失败时状态
true容量已保证—
false扩容失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 预留容量

		(void)xrtStackReserve(pStack, 32u);

xrtStackTrim函数

将动态栈容量裁剪到当前深度。

bool xrtStackTrim(xstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
true已裁剪(或无需裁剪)—
false裁剪失败XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 裁剪容量

		(void)xrtStackTrim(pStack);

xrtStackGet函数

返回指定 0 基位置的可写元素借用地址。

ptr xrtStackGet(xstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取写

		(void)xrtStackGet(pStack, 0u);

xrtStackConstGet函数

返回指定 0 基位置的只读元素借用地址。

const void* xrtStackConstGet(const xstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取读

			const int* pGet = (const int*)xrtStackConstGet(pStack, 0u);

xrtStackAdd函数

取得一个未初始化栈顶槽;容量不足时自动扩容。

ptr xrtStackAdd(xstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
非空未初始化栈顶槽—
NULL扩容失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 取得栈顶槽

			int* pSlot = (int*)xrtStackAdd(pStack);

xrtStackPush函数

复制一个元素压入动态栈;容量不足时自动扩容。

bool xrtStackPush(xstack* pStack, const void* pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输入非空要压入的元素
返回值
返回含义失败时状态
true已压入—
false扩容失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 复制压入

			if ( !xrtStackPush(pStack, &iValue) ) {

xrtStackPop函数

弹出栈顶元素,并可把内容复制到外部输出缓冲。

bool xrtStackPop(xstack* pStack, ptr pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输出允许空;不与栈重叠接收弹出的元素
返回值
返回含义失败时状态
true已弹出—
false栈空或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

cstack · 弹出

	while ( xrtStackPop(&tValues, &iValue) ) {

xrtStackPeek函数

返回距栈顶指定深度的可写元素,深度 0 表示栈顶。

ptr xrtStackPeek(xstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取写

		(void)xrtStackPeek(pStack, 0u);

xrtStackConstPeek函数

返回距栈顶指定深度的只读元素,深度 0 表示栈顶。

const void* xrtStackConstPeek(const xstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取读

			const int* pPeek = (const int*)xrtStackConstPeek(pStack, 0u);

xrtStackTop函数

返回可写栈顶元素借用地址。

ptr xrtStackTop(xstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶写

			int* pTop = (int*)xrtStackTop(pStack);

xrtStackConstTop函数

返回只读栈顶元素借用地址。

const void* xrtStackConstTop(const xstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶读

		(void)xrtStackConstTop(pStack);
LIFO 与低层访问

xrtBlockStackInit函数

使用自动块尺寸初始化默认对齐分块栈。

bool xrtBlockStackInit(xblockstack* pStack, size_t iItemSize)

参数

参数方向约束说明
pStack输出非空接收栈
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
true已初始化—
false布局参数非法见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 默认初始化

			(void)xrtBlockStackInit(&tInit, sizeof(int));

xrtBlockStackInitLayout函数

使用指定元素对齐和每块元素数初始化分块栈。

bool xrtBlockStackInitLayout(xblockstack* pStack, size_t iItemSize, size_t iAlignment, size_t iBlockItems)

参数

参数方向约束说明
pStack输出非空接收栈
iItemSize输入> 0元素字节数
iAlignment输入二次幂元素对齐
iBlockItems输入> 0每块元素数
返回值
返回含义失败时状态
true已初始化—
false布局参数非法见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

block · 完整布局初始化

	if ( !xrtBlockStackInitLayout(&tFrames, sizeof(int), sizeof(int), 4) ) {

xrtBlockStackCreate函数

创建使用自动块尺寸的默认对齐分块栈。

xblockstack* xrtBlockStackCreate(size_t iItemSize)

参数

参数方向约束说明
iItemSize输入> 0元素字节数
返回值
返回含义失败时状态
非空分块栈—
NULL创建失败见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 堆创建

		xblockstack* pBlock = xrtBlockStackCreate(sizeof(int));

xrtBlockStackCreateLayout函数

创建使用指定元素对齐和每块元素数的分块栈。

xblockstack* xrtBlockStackCreateLayout(size_t iItemSize, size_t iAlignment, size_t iBlockItems)

参数

参数方向约束说明
iItemSize输入> 0元素字节数
iAlignment输入二次幂元素对齐
iBlockItems输入> 0每块元素数
返回值
返回含义失败时状态
非空分块栈—
NULL创建失败见错误
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量或尺寸计算溢出
  • XERR_VALUE — 对齐不是二次幂
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

tour · 堆创建(完整布局)

		xrtBlockStackDestroy(xrtBlockStackCreateLayout(sizeof(int), 4u, 8u));

xrtBlockStackUnit函数

释放全部数据块和块索引,但不释放栈结构。

void xrtBlockStackUnit(xblockstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无数据块已释放—
错误
  • 无 — 释放不失败

范例已编译验证

block · 释放数据块

		xrtBlockStackUnit(&tFrames);

xrtBlockStackDestroy函数

释放分块栈全部资源和创建的栈结构。

void xrtBlockStackDestroy(xblockstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无栈已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

tour · 销毁

		xrtBlockStackDestroy(xrtBlockStackCreateLayout(sizeof(int), 4u, 8u));

xrtBlockStackClear函数

清空分块栈并保留已经分配的数据块。

void xrtBlockStackClear(xblockstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
无已清空—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 清空

		xrtBlockStackClear(pBlock);

xrtBlockStackReserve函数

保证分块栈至少具有指定元素容量,失败时保持原状态。

bool xrtBlockStackReserve(xblockstack* pStack, size_t iCapacity)

参数

参数方向约束说明
pStack输入/输出非空目标栈
iCapacity输入—期望容量
返回值
返回含义失败时状态
true容量已保证—
false扩容失败,原状态保持XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 预留容量

		(void)xrtBlockStackReserve(pBlock, 16u);

xrtBlockStackTrim函数

释放当前深度不再需要的数据块,保留轻量块索引缓存。

bool xrtBlockStackTrim(xblockstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
true已裁剪—
false裁剪失败XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 裁剪

		(void)xrtBlockStackTrim(pBlock);

xrtBlockStackGet函数

返回指定 0 基位置的可写元素借用地址。

ptr xrtBlockStackGet(xblockstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

block · 按位取写

		xrtBlockStackGet(&tFrames, 0) == pRoot ? "yes" : "no"

xrtBlockStackConstGet函数

返回指定 0 基位置的只读元素借用地址。

const void* xrtBlockStackConstGet(const xblockstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取读

		(void)xrtBlockStackConstGet(pBlock, 0u);

xrtBlockStackAdd函数

取得一个未初始化栈顶槽,既有活动元素地址保持稳定。

ptr xrtBlockStackAdd(xblockstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
非空未初始化栈顶槽—
NULL新块分配失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 块布局尺寸溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

block · 取得栈顶槽

	pRoot = (int*)xrtBlockStackAdd(&tFrames);

xrtBlockStackPush函数

浅复制一个完整可读元素压入分块栈,来源可以是任一活动元素。

bool xrtBlockStackPush(xblockstack* pStack, const void* pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输入非空要压入的元素
返回值
返回含义失败时状态
true已压入—
false分配失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 块布局尺寸溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

block · 浅复制压入

		if ( !xrtBlockStackPush(&tFrames, &i) ) {

xrtBlockStackPop函数

弹出栈顶元素;调用方必须保证可选输出不与该栈的任何数据块重叠。

bool xrtBlockStackPop(xblockstack* pStack, ptr pItem)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pItem输出允许空;不与数据块重叠接收弹出的元素
返回值
返回含义失败时状态
true已弹出—
false栈空或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 弹出

			(void)xrtBlockStackPop(pBlock, &iPop);

xrtBlockStackPeek函数

返回距栈顶指定深度的可写元素,深度 0 表示栈顶。

ptr xrtBlockStackPeek(xblockstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取写

		(void)xrtBlockStackPeek(pBlock, 0u);

xrtBlockStackConstPeek函数

返回距栈顶指定深度的只读元素,深度 0 表示栈顶。

const void* xrtBlockStackConstPeek(const xblockstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取读

		(void)xrtBlockStackConstPeek(pBlock, 0u);

xrtBlockStackTop函数

返回可写栈顶元素借用地址。

ptr xrtBlockStackTop(xblockstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶写

		(void)xrtBlockStackTop(pBlock);

xrtBlockStackConstTop函数

返回只读栈顶元素借用地址。

const void* xrtBlockStackConstTop(const xblockstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
非空只读元素借用地址—
NULL越界或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶读

			const int* pTop = (const int*)xrtBlockStackConstTop(pBlock);
PtrStack

xrtPtrStackInit函数

初始化空指针栈。

bool xrtPtrStackInit(xptrstack* pStack)

参数

参数方向约束说明
pStack输出非空接收栈
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

pstack · 初始化

	if ( !xrtPtrStackInit(&tResources) ) {

xrtPtrStackCreate函数

创建空指针栈。

xptrstack* xrtPtrStackCreate()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
非空指针栈—
NULL分配失败XERR_MEMORY
错误
  • XERR_MEMORY — 结构分配失败

范例已编译验证

tour · 堆创建

		xptrstack* pPtr = xrtPtrStackCreate();

xrtPtrStackUnit函数

释放指针存储区但不释放指针目标。

void xrtPtrStackUnit(xptrstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无存储已释放—
错误
  • 无 — 释放不失败

范例已编译验证

pstack · 释放存储

			xrtPtrStackUnit(&tResources);

xrtPtrStackDestroy函数

释放指针栈全部资源和栈结构,但不释放指针目标。

void xrtPtrStackDestroy(xptrstack* pStack)

参数

参数方向约束说明
pStack输入允许空空 = 空操作
返回值
返回含义失败时状态
无栈已销毁—
错误
  • 无 — 释放不失败

范例已编译验证

tour · 销毁

		xrtPtrStackDestroy(pPtr);

xrtPtrStackClear函数

清空指针栈并保留容量,但不释放指针目标。

void xrtPtrStackClear(xptrstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
无已清空—
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法

范例已编译验证

tour · 清空

		xrtPtrStackClear(pPtr);

xrtPtrStackReserve函数

保证指针栈至少具有指定容量。

bool xrtPtrStackReserve(xptrstack* pStack, size_t iCapacity)

参数

参数方向约束说明
pStack输入/输出非空目标栈
iCapacity输入—期望容量
返回值
返回含义失败时状态
true容量已保证—
false扩容失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 预留容量

		(void)xrtPtrStackReserve(pPtr, 16u);

xrtPtrStackTrim函数

将指针栈容量裁剪到当前深度。

bool xrtPtrStackTrim(xptrstack* pStack)

参数

参数方向约束说明
pStack输入/输出非空目标栈
返回值
返回含义失败时状态
true已裁剪—
false裁剪失败XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

tour · 裁剪容量

		(void)xrtPtrStackTrim(pPtr);

xrtPtrStackGet函数

返回指定 0 基位置的指针值。

ptr xrtPtrStackGet(const xptrstack* pStack, size_t iIndex)

参数

参数方向约束说明
pStack输入非空目标栈
iIndex输入< 深度0 基位置
返回值
返回含义失败时状态
指针值存储的值(可为空值)—
NULL越界XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 按位取值

		(void)xrtPtrStackGet(pPtr, 0u);

xrtPtrStackPush函数

压入一个可为空的指针值;容量不足时自动扩容。

bool xrtPtrStackPush(xptrstack* pStack, ptr pValue)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pValue输入任意值要压入的指针
返回值
返回含义失败时状态
true已压入—
false扩容失败XERR_RANGE / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 容量溢出
  • XERR_MEMORY — 扩容分配失败

范例已编译验证

pstack · 压入

		if ( !xrtPtrStackPush(&tResources, &pValues[i]) ) {

xrtPtrStackPop函数

弹出指针值;输出为空表示只删除栈顶。

bool xrtPtrStackPop(xptrstack* pStack, ptr* pValue)

参数

参数方向约束说明
pStack输入/输出非空目标栈
pValue输出允许空接收弹出的值
返回值
返回含义失败时状态
true已弹出—
false栈空或参数非法XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

pstack · 弹出

	while ( xrtPtrStackPop(&tResources, &pValue) ) {

xrtPtrStackPeek函数

返回距栈顶指定深度的指针值,深度 0 表示栈顶。

ptr xrtPtrStackPeek(const xptrstack* pStack, size_t iDepth)

参数

参数方向约束说明
pStack输入非空目标栈
iDepth输入< 深度距栈顶深度
返回值
返回含义失败时状态
指针值存储的值(可为空值)—
NULL越界XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 索引或深度越界

范例已编译验证

tour · 深度取值

		(void)xrtPtrStackPeek(pPtr, 0u);

xrtPtrStackTop函数

返回栈顶指针值;合法空值与错误通过错误状态区分。

ptr xrtPtrStackTop(const xptrstack* pStack)

参数

参数方向约束说明
pStack输入非空目标栈
返回值
返回含义失败时状态
指针值栈顶值(可为合法空值)—
NULL栈空XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空、元素大小为零或参数非法
  • XERR_RANGE — 栈为空

范例已编译验证

tour · 栈顶值

			ptr pTop = xrtPtrStackTop(pPtr);

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XRT_BLOCK_STACK_BYTES_DEFAULT见头文件注释
XRT_BLOCK_STACK_ITEMS_MAX见头文件注释