泛型编程:再现Min和Max[VC/C++编程]
本文“泛型编程:再现Min和Max[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在1995年1月,Scott Meyers 在C++ Report杂志上就夸大"min,max 对C++社团来说是一个很大的挑衅",他对基于macro-based实现的min,max举行认真的解析,对比基于模板的min,max实现,他得到了以下结论:
“关于实现max,什么是最好的办法?”用一句Tevye的名言:“我将奉告你:我不知道”,基于以上解析,我有信心奉告大家宏实现的办法,大概是最好的,不过,我个人很讨厌:宏.因此,大家假若有什么更好的实现办法,请赶忙奉告我.
按照我个人的知识,在本日这个时刻,这个挑衅仍然存在,在这篇文章中,我将面对这个挑衅,但是,在我开始之前,让我们往复想一下从前泛型编程,是若何糟糕实现这个算法的.
自从"Generic<Programming>: volatile - Multithreaded Programmer''s Best Friend" 发表后,我接到很多邮件.在这些邮件中,我接到很多的嘉奖,同时,也有很多对the Usenet newsgroups comp.lang.c++新闻组和 comp.programming.threads的抱怨.这个谈论对比激烈,假如,你有爱好,你可以去参与.标题是:"volatile, was: memory visibility between threads."一个谈论.
在这些谈论中,我认为,我学到很多的知识,在这里很多独立的例子,好了,长话短说,很多系统不会改正volatile 数据(比方在POSIX编译系统中),同时在别的的一些系统中,加入volatile量,也无助于程序的质量提高,关于volatile mutexes精确利用的最重要问题,是它依靠于近似于posix mutexes,同时,在多进程系统中,这种互斥量常常是不够的,因此,你必须利用内存保护.
别的一个更具有哲学意义的问题是,严峻的讲,volatile法则远离变量是不公道的,就算你增添的volatile符合你利用volatile的法则.
一个系统能存储volatile数据在差别的位置,不像non-volatile数据那样,因此,固定其存储地址将使得系统不安定.volatile的精确性也是别的一个被批判的对象,固然它可以在低水平的race condition,但是,不能在更高的层次检测逻辑上的race condition.比方,你有一个像std::vector的类mt_vector,同时还有一些同步的成员函数.
以下:
volatile mt_vector<int> vec;
...
if (!vec.empty()) {
vec.pop_back();
}
本来的设法是安闲器vector中移走最后一个元素,在单线程环境下,这段代码会运行的很好,但是,假如你在多线程利用这样的代码,常常会呈现非常的,就算你的empty(),pop_bock()已经得当的同步了.因此,可以说,低层次的数据一致性得到保护,但是,更高水平的数据操作,常常是不安定的.
至少,按照以上的解析,我开始保持我的求证volatile办法,这是个有效检测在近似posix互斥量race conditions的好办法.但是,假如你从事多进程系统的内存存取权限安置的话,那么,你首先应当细听你的编译器文档资料.你应当知道你该干什么.Kenneth Chiu 提到一篇很风趣的论文: http://theory.stanford.edu/~freunds/race.ps, pape讲授了 "Type-Based Race Detection for Java."
由于Java范例系统只有很少的限制条件,这就使得编译器有大概和程序员一同来在编译时刻检测race conditions.
Min 和Max
来让我们再看看Scott提出的挑衅,基于宏定义的min()以下:
#define min(a, b) ((a) < (b) ? (a) : (b))
由于它是完好范型的,因此,它常常能很好的施展作用.(只要这个表达式中 < 、?是有定义的)很不幸的是min()老是要计算它中间一个参数两次,这样,就招致很多令人困惑的问题.(译注:假定以下调用,a=3,b=5 int c=min(a++,b);后果我们会得到c=4的后果.明显不是我们所但愿的)宏定义只是在表面情势上跟函数相像,但是,它的行为常常跟函数两个样.(假如你想得到更多的相关知识,那么,你可以查阅Herb的有关这方面的资料)在C++尺度库中有一个越发有效的实现,它是基于模板的办理筹划,以下:
const T& min(const T& lhs, const T& rhs)
{
return lhs < rhs ? lhs : rhs;
}
你可以看出这个筹划中参数和返回值都是const型,这也就招致一个问题.大概,你想把两个数值中小的那个的数值加2,那么,你大概会这么写:
double a, b;
...
min(a, b) += 2;
基于宏定义min()就不会呈现问题,但是,假如是模板基于模板上实现就不会那么听话了.因为你是不能改变const变量的值的,好像Scott所注意的一样.我们来更新我们的实现:
T& min(T& lhs, T& rhs)
{
return lhs < rhs ? lhs : rhs;
}
以上是“泛型编程:再现Min和Max[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |