advanced-go-programming-book icon indicating copy to clipboard operation
advanced-go-programming-book copied to clipboard

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

Open icaiyu opened this issue 6 years ago • 1 comments

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

icaiyu avatar Jul 27 '19 16:07 icaiyu

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在排序不同数组的时候,将它们统一绑定到了固定的全局函数。 全局函数无法动态获取当前排序的数组。

chai2010 avatar Aug 10 '19 07:08 chai2010