template <class T> void mysort (T *const array ,int from ,int to) { if (from >= to) return ; int i = from ; int j = to ; T tmp = std::move (array[i]) ; while (true) { while (i < j && tmp < array[j]) j-- ; if (i >= j) break ; array[i++] = std::move (array[j]) ; while (i < j && array[i] < tmp) i++ ; if (i >= j) break ; array[j--] = std::move (array[i]) ; } array[i] = std::move (tmp) ; mysort (array ,from ,i - 1) ; mysort (array ,j + 1 ,to) ; } ///////////////////////////////////////////////////////////////// #include <functional> #include <new> template <class T> void mysort (T *const array ,int from ,int to ,const std::function<bool (const T & ,const T &)> &less) { static const std::function<bool (const T & ,const T &)> *const pless = &less ; struct EXT { char unused[sizeof (T)] ; inline EXT (EXT &&r) { new (this) T (std::move (reinterpret_cast<T &> (r))) ;} inline EXT &operator= (EXT &&r) { reinterpret_cast<T &> (*this) = std::move (reinterpret_cast<T &> (r)) ; return *this ; } inline bool operator< (const EXT &r) const { return (*pless) (reinterpret_cast<const T &> (*this) ,reinterpret_cast<const T &> (r)) ; } } ; mysort<EXT> ((EXT *) array ,from ,to) ; } #include <iostream> #include <algorithm> using namespace std ; int main () { const int a[] = {1 ,3 ,3 ,2 ,4 ,1} ; int b[__crt_countof (a)] ; for (int i = 0 ; i < __crt_countof (a) ; i++) b[i] = i ; mysort<int> (b ,0 ,__crt_countof (a) - 1 ,std::bind ([] (const int &rl ,const int &rr ,const int *arr) { return arr[rl] < arr[rr] ; } ,std::placeholders::_1 ,std::placeholders::_2 ,(const int *) a)) ; for (int i = 0 ; i < __crt_countof (a) ; i++) cout << a[b[i]] << " " ; return 0 ; }
想重用最上面的sort来做外部排序
按理说c++运行的时候应该会记录当前函数的栈帧,那为什么EXT不能直接访问less呢
现在用个静态变量传递less,貌似这样写会有多线程同步问题
加锁或threadlocal会严重影响效率吗,怎样实现比较好
解决方案
15
假如能用tls那肯定最好了。
10
1. 不同于Java或C#(可在运行过程中动态生成类型信息), C++中EXE的类型信息(包括成员变量和成员函数)在编译时就已经确定了, 而自动变量的地址是在运行时确定的。
2. 能否存在多线程同步访问的问题取决于less怎么样实现。假如less实现为可重入或线程安全则不会有什么问题。
2. 能否存在多线程同步访问的问题取决于less怎么样实现。假如less实现为可重入或线程安全则不会有什么问题。
15
线程是一次执行,是一个执行序列的一次运行,
线程函数,是线程要执行的代码
线程函数内部,调用的函数,其实跟线程没关系,它只是执行序列的一个局部。
任何线程都可以调用它
其中需要同步的部分(使用共享资源的部分),
才跟多线程相关
共享资源,也可以包括。某些局部变量
原因是启动线程的函数,所在线程可以把局部变量的地址传入线程中
这些对象,在启动线程的函数结束的时候,生命周期就结束了
这个地方,也需要同步一下
线程函数,是线程要执行的代码
线程函数内部,调用的函数,其实跟线程没关系,它只是执行序列的一个局部。
任何线程都可以调用它
其中需要同步的部分(使用共享资源的部分),
才跟多线程相关
共享资源,也可以包括。某些局部变量
原因是启动线程的函数,所在线程可以把局部变量的地址传入线程中
这些对象,在启动线程的函数结束的时候,生命周期就结束了
这个地方,也需要同步一下