gpt4 book ai didi

c - 这是 Sean Barrett 编写的 27 行 C 中 Vector 的实现。有人可以向我解释这是如何工作的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:55:57 26 4
gpt4 key购买 nike

来自这里:A tidy little C implementation of stretchy buffers (aka C++ vectors)代码的描述是这样说的:

declare an empty buffer with something like 'mytype myarray = NULL', and then use the sb() functions to manipulate; read/write individual elements by indexing as usual

首先我应该说我只知道一点点 C,这基本上是未知领域。我从未使用过双指针、void 指针或任何内存函数,如 realloc。有人可以用简单的英语解释这段代码中发生了什么吗?它使用了很多我不理解的花哨的宏定义,这让我想知道正确地写出来会是什么样子。

代码:

  // stretchy buffer // init: NULL // free: sbfree() // push_back: sbpush() // size: sbcount() //
#define sbfree(a) ((a) ? free(stb__sbraw(a)),0 : 0)
#define sbpush(a,v) (stb__sbmaybegrow(a,1), (a)[stb__sbn(a)++] = (v))
#define sbcount(a) ((a) ? stb__sbn(a) : 0)
#define sbadd(a,n) (stb__sbmaybegrow(a,n), stb__sbn(a)+=(n), &(a)[stb__sbn(a)-(n)])
#define sblast(a) ((a)[stb__sbn(a)-1])

#include <stdlib.h>
#define stb__sbraw(a) ((int *) (a) - 2)
#define stb__sbm(a) stb__sbraw(a)[0]
#define stb__sbn(a) stb__sbraw(a)[1]

#define stb__sbneedgrow(a,n) ((a)==0 || stb__sbn(a)+n >= stb__sbm(a))
#define stb__sbmaybegrow(a,n) (stb__sbneedgrow(a,(n)) ? stb__sbgrow(a,n) : 0)
#define stb__sbgrow(a,n) stb__sbgrowf((void **) &(a), (n), sizeof(*(a)))

static void stb__sbgrowf(void **arr, int increment, int itemsize)
{
int m = *arr ? 2*stb__sbm(*arr)+increment : increment+1;
void *p = realloc(*arr ? stb__sbraw(*arr) : 0, itemsize * m + sizeof(int)*2);
assert(p);
if (p) {
if (!*arr) ((int *) p)[1] = 0;
*arr = (void *) ((int *) p + 2);
stb__sbm(*arr) = m;
}
}

最佳答案

在代码中,弹性缓冲区类似于具有三个元素的struct

  1. int sbm:缓冲区中的元素个数。
  2. int sbn:缓冲区可以增长到无需重新分配的元素数。
  3. ???:您的数据(未知类型和大小)。

当您创建一个缓冲区时,代码会返回一个指向“您的数据”部分的指针,因此使用该部分的负偏移量来到达其他两个字段。因为 NULL 缓冲区指针被视为空缓冲区,所以需要在许多地方进行特殊处理。类似于 (a) 的代码? x : y 表示如果 aNULL,则返回 x,否则返回 y

有一些习语是常见 C 结构的宏版本:

  1. a, b == a; b;.
  2. p ? x : y == if (p) a;否则 b;.

宏参数的使用通常放在额外的括号中,宏定义也是如此,以使宏可以安全地与表达式作为参数一起使用,因此宏可以放在表达式的中间。

当你添加n元素时,代码会测试sbm + n是否大于sbn;如果是,则 realloc 用于创建新缓冲区,并且 sbn 重置为更大的大小。然后输入您的数据。

关于c - 这是 Sean Barrett 编写的 27 行 C 中 Vector 的实现。有人可以向我解释这是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894881/

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