In computer programming, a variable is a storage location and an associated symbolic name (an identifier) which contains some known or unknown quantity or information, a value.
我们知道,C++一般尽量使用库提供功能特性而不是从语言本身开刀(貌似python也是这么宣称的),但这次C++11标准带来了大量的语言特性,甚至可以当成一门新语言来学,哪怕你有C++基础,这其中包括重在提高运行时性能的右值引用,提高易用性的统一初始化、lambda、自动类型推断等,增强语言功能的变参模版、用户自定义字面常量等。随着现在多核的流行,C++终于在语言层面上支持了多线程编程,提供了线程类、同步原语、原子类型以及异步相关的类型和操作。你要问为什么要在语言层面上进行支持而不是只用库提供,毕竟现在已经有大量用C++加类库写成的多线程代码了,而且似乎都工作的很好,因为 Threads Cannot be Implemented as a Library.
为什么禁了编译器优化也不能正确运行呢,因为。。。现代CPU速度非常快,频率都在2GHz上下甚至3GHz还多,以前Pentium4都有超频到8GHz左右的,按2GHz算,一个周期就是0.5ns;而它的搭档内存又“非常慢”,核心频率大概在200MHz上下(神马,我的DDR3不是都1600Mhz吗,额,那是数据传输频率,大概就是核心频率一下可以吐8个bit而不是1个,换算回来核心频率还是200MHz,单论反应速度不比当年的SDRAM好多少),然后还有反应延迟,CPU说要某个地址的数据了,内存要慢悠悠转上几个周期先,然后才能拿到数据往CPU送,所以内存引用一次就要消耗大概100ns。CPU执行计算肯定要使用内存的数据,要是这么等内存,那太伤CPU感情了,白跑那么快,全浪费在等内存上了,所以根据程序的局部性原理(Locality of Reference),在CPU和内存之间加上一个比内存小点但快很多的cache来保存可能要用到的数据,然后我们就获得了一个比cache略慢但是和主内存一样大的内存;内存也不甘寂寞,通过pipeline的方式使自己忙起来,尽力一次多传点数据。有了这些机制也不意味着CPU就能直接从中完全受益,还需要CPU进行很多的配合以充分利用,比如一旦cache命中失败,CPU可以执行后边的指令而不是干等,这样就有了乱序执行,这种内存操作的性质称为Memory Ordering.而且有了cache,CPU往内存写数据也要多考虑点,是直接连cache带内存都写呢还是先写cache一会再写到内存呢,如果其他cpu的cache里也有相同数据怎么办呢。这样,当多个线程同时执行时,彼此都可以看到对方的执行样子,这么赤裸裸的,怎么会不出问题呢。
allBuildingTypes=..icons=getAllBuildingIcons(allBuildingTypes)enableStates=calcEnableStates(allBuildingTypes,otherArgs)\# assume buildingPanel is the panelbuildingPanel.setIconList(icons)forindex,enabledinenumerate(enableStates):buildingPanel.setBtnEnable(index,enabled)
classButtonData(object):def__init__(self,icon,callback,enabled,tip)self.icon=iconself.callback=callback# called when clickedself.enabled=enabledself.tip=tip
我觉得,以callable(functions/callable class instance/closure/partial(bind))为基础建立起来的回调机制,是使得模块划分清晰的有力武器,主动通知方不需要了解被通知方的任何性质,被通知方也不需要按照某种硬性interface规格来使自己适应,而且callable本身就包含了足够的信息进行处理(closure或者bind或者callable class instance的形式保存),各自可以说井水不犯河水。用duck type的意思来说,在主动通知方看来,你看起来是我要的callback,那你就是我要的callback,不管你是function还是closure还是instance还是什么。在Python里,我们可以轻松的用lambda或者functools.partial,或者复杂点自己写个定义了call的类。在最新的CPP11里,也融合了大量的函数式编程的内容,包括lambda/std::function/std::bind,让我们活得轻松点。据说java8里也有lambda什么的了,但是看起来笨笨的,没那么duck typing。。
n is 1返回True是由于Python对于小整数的优化(小整数都是预先创建好的,需要时直接使用),a is 1000返回False是因为一般的整数都是需要时直接创建的对象并且就算之前有相同的值的对象也不会复用。不过如果写1000 is 1000是会返回True的,因为这俩字面常量实际上引用了一个对象,这应该是编译器的优化吧。[] is []返回False就显而易见了,因为每个list都是全新的对象,不会复用已有的对象。