现在的位置: 首页 > 综合 > 正文

果然,C语言就不贱嗖嗖的:以realloc为例

2013年10月17日 ⁄ 综合 ⁄ 共 2355字 ⁄ 字号 评论关闭

果然,C语言就不贱嗖嗖的:以realloc为例

贱嗖嗖,也许是东北方言?它的意思大致是别人不需要你做的事情,你偏要替别
人做了,甚至可能还起到了负面的效果。比如网上有张照片的笑话,说是保姆看
小资的单反镜头太脏了,全泡肥皂水里刷了一遍。大致吧,这个时候小资心里的
看法大致就是你怎么这么贱嗖嗖的。

据说计算机程序是牛人设计出来,给傻子用的。既然是给傻子用的,就一定要考
虑得非常周到才行。所以,作为傻子之一,我就常有这样的感慨:你怎么这么贱
嗖嗖的。

前两天跟包师弟、关同学、孙同学一起写驱动,用了windows7操作系统。整个下
午诸多不顺,原因,我总结的一条就是一众软件都贱嗖嗖的。比如,win7下拖动
文件图标,它跳出来问你,你是要复制啊还是要搬移,还是要怎么的。难道我的
操作指令还不够明确,或者win7的用户比winxp的用户更弱智了,所以它觉得不
得不提醒一下?

我想起了当年玩光荣公司的三国志英杰传,每当退出的时候,它都会三番五次地
跟你确认"你真的是要退出了么""你的确是要退出了么""退出游戏可就不能玩了啊
",大致这样的意思。终于客气完了,界面就要回到操作系统之前,它又跳出来
说,"您辛苦啦。"

周到,真是周到。看日本小巷里老头老太太不断地相互鞠躬道别,也不过如此。
转过街角,还要回头再哈一下腰吧。周道则周道矣,效率却奇差无比。

我要退出就是要退出的意思,你一遍一遍地跟我确认,真是伤害我的自尊,好像
不如此关照不足以彰显我是个弱智儿童。你能悄没声地干活,少跳出来提醒我么。
同样的道理也适用于QQ、360等非要在启动的时候弹出个窗口,提醒我现在有哪
些国家大事。还有windows窗口右上角那个血红的叉子,我想退出的时候能找得
到,不用这么明显地一直一直提醒我你存在。

这么贴心 (还有某处方言,窝心)地关照,总让我担心里面包藏祸心。

马利老师前两天博客提到,他如何教导了刺头同学。他作为男老师的这种干脆
劲,该罚罚该讲道理讲道理,令人耳目一心。作为对比,我不由得想起当年教过
我的一些女性老师。柔则柔矣,有些确实有阴的痕迹。盖阴柔二字组成一词不是
没有道理的。

编排老师不是我等学生应该做的事,所以某些女老师的做法估且跳过。编排另一
位,女医生。N年前我看牙的时候,那位牙医是位女士。当时我做的是根管治疗,
就是拿一根特细的小铁丝往里面捅啊捅,然后钻两圈。我很快就全身温透了。她
总是阴柔地说"快了快了"。此时我想,反正快了,可以再忍一下。但是,仍然没
有"快"结束。如是者三,我就明白了,她在骗我,"快了"二字就再也起不到任何
作用了。再后来,她说其实如果实在受不了,是可以用麻药的。虽然道理上似乎
对,但是我却再也不相信她,一定要封上不治了。

"快了"不是一个她预见到可能发生的事件,而是用来安慰病人的一组声音而已。
而它起作用的前提,是病人相信这组声音的意义。当这组声音失去意义的时候,
信任也一同失去了。

类似的引导性的关照,你是不是在你的女老师身上也发现过?

孙子兵法说,不要告诉士兵行军的目标;使用士兵,要如驱羊群。这种观点据说
现代还有些争议,即是否要发挥人民群众的力量、人民群众到底是不是主人、主
人价值如何体驱啥的。这些观点都太高深了,我完全无法理解。我能理解的是:
君视民如草芥,民视君如寇仇。如果你骗我,利用我,驱使我,认为我是弱智,
我没有理由表现很聪明的样子啊。

当软件把用户当成襁褓里的婴儿,这样呵护下成长起来的用户还有能力做些什么
呢?同样,凡事都由老师安排好了的学生,一旦失去或离开老师,会有什么样的
能力呢?据说某些初中学校的教学方法就是让学生做题做题做题,学生们做题做
伤了,到了高中大学就没有后劲了。我倒更乐意相信,那是因为老师在学习方法
上把学生照顾得太无微不致了,学生没有获得 (而不是失去)了主动性和独立性。

独立地判断,正是人类区别于动物的一个特征。独立于感受,运用理性;独立于
他人,保持自我。

也有个别的程序,知道尊重用户,或者说,把用户当成与它同等聪明和具有判断
力的"人类"。

袁小康同学来信问我,C/C++中的realloc函数的事。他说:realloc重新为一个
指针指向的内存分配空间。如果剩余的空间够大,内存地址不变,空间向后延
伸;如果内存空间不够大,那么,系统为这一指针指向的内存重新分配一块空
间,把原来空间里的东西都复制过来。他的问题的:如果还有其他的指针指向同
一空间,那些指针怎么办呢?

如果不进行任何处理,那些指针就成了野指针。

我回信,猜系统会更新那些指针的地址。而且建议他做实验验证一下。

没多一会儿,袁同学回信来,其余的指针的地址并未更新。我猜错了。

查了一下资料。C/C++的realloc就是没有更新那些指针的地址,它只是把新的
(或旧的)地址作为返回值了。判断地址是否换了,是程序员,而不是编译器或运
行时库的责任。

表面上看,C/C++对程序员关照得并不充分细致。但是,考虑到并非每次realloc
都会导致内存地址改变,如果每次realloc都更新所有指针,会导致效率下降。
这些并非必要的工作,C/C++交由程序员处理,而不是事无巨细,万帮代办。

C/C++相信和要求它的程序员是睿智的人类,因此,它的使用者,或者说能够驾驭
它的,也一定是睿智的人类。请注意,是驾驭C/C++的,而不是被C/C++驾驭的。
那些细心为你考虑所有问题,希望你连思考都不必的,一定是希望驾驭你。

尊重的特征,是真诚。

与工具的交流是这样,与人的交流也没有区别。

如果我们交流,我要知道所有发生的事情,我可以选择放弃知道,你也可以选择
拒绝告知。但是,欺骗、隐瞒、诱导、强迫、暗示并考验,都是对我故意冒犯和
挑战,此时,我就不得不以反击证明我的智商比你估计的要高一些。

或者,你明确地告诉我,在这件事中,我是工具,因此不必负有人类的责任。然
后,我来告诉你我是否愿意。

抱歉!评论已关闭.