Code Bye

为什么c++内部类型,不能直接访问自动变量呢

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实现为可重入或线程安全则不会有什么问题。

15

线程是一次执行,是一个执行序列的一次运行,
线程函数,是线程要执行的代码
线程函数内部,调用的函数,其实跟线程没关系,它只是执行序列的一个局部。
任何线程都可以调用它
其中需要同步的部分(使用共享资源的部分),
才跟多线程相关
共享资源,也可以包括。某些局部变量
原因是启动线程的函数,所在线程可以把局部变量的地址传入线程中
这些对象,在启动线程的函数结束的时候,生命周期就结束了
这个地方,也需要同步一下

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么c++内部类型,不能直接访问自动变量呢