chai2010/advanced-go-programming-book

2.6.3 改进:闭包函数作为比较函数 有一点点小疑惑

icaiyu opened this issue · 1 comments

除了全局这种代理之外,还有其他什么办法嘛?感觉这样绕来绕去很复杂,还有就是这样就没法并发,改进的话?有大佬提示一下思路吗?

C语言最大的限制是全局函数,全局函数要绑定到qsort的数组必须一个额外的指针。
有一些折中的优化:可以定义很多全局的cmp函数,然后分配给不同的数组,这样并发度会大一点。

对于qsort来说,这个函数的接口设计有点缺陷:就是没有为cmp额外携带一个参数。
比如设计为下面这样:

void qsort(
    void* base, size_t num, size_t size,
    int (*cmp)(const void* a, const void* b, void* ctx),
    void* cmp_ctx
);

为cmp增加一个ctx参数,就可以避免这个问题。

所以核心问题是qsort在排序不同数组的时候,将它们统一绑定到了固定的全局函数。
全局函数无法动态获取当前排序的数组。