首页 > 解决方案 > 如何就地修改项目(不复制/传递缓冲区)

问题描述

我经常看到 C 中的函数类似于以下内容:

do_something(buffer, original_data)

在这种情况下,它获取原始数据(通常const)并将用户请求的数据返回到缓冲区中。例如,类似getsor的函数readline

如果程序存在特定的内存限制并且没有空间来返回原始数据和请求的数据怎么办。例如,如果有 1GB 的文本数据需要排序,而用户没有 2GB 可用怎么办。可以通过就地修改数据来运行的函数(例如排序函数)的示例是什么?

标签: cmemory

解决方案


标准库函数qsort

void qsort(void *base, size_t nmemb, size_t size,
              int (*compar)(const void *, const void *));

传入要排序的数组,传入base长度,传入nmemb每个元素的大小,传入size比较函数compar

调用看起来像这样:

char **strings = NULL;
size_t nstrings = 0;
// do something to load strings;

//...

// sort the strings
qsort(strings, nstrings, sizeof(char *), string_comparer);


int string_comparer(const void *a, const void *b) { return strcmp(*(const char *)a, *const char *b); }

由于缺少传递给函数的指挥棒,这个 API 感觉有点陈旧和笨重,但随着gcc扩展允许内部函数访问外部函数中的变量,这不再是一个真正的问题。

某人的 glibc 镜像在qsort这里:https ://code.woboq.org/userspace/glibc/stdlib/qsort.c.html内核版本在这里:https ://github.com/torvalds/linux/blob/8a72f3820c4d14b27ad5336aed00063a7a7f1bef /lib/sort.c


推荐阅读