Aaron's profile做最好的自己PhotosBlogListsMore Tools Help

做最好的自己

Be My Personal Best

Aaron taoyu

Occupation

Feed

The owner hasn't specified a feed for this module yet.
February 05

[zz]最常见的20种VC++编译错误信息集合

最常见的20种VC++编译错误信息集合

再网上看到的,大部分都比较常见,对初学者挺有用~~~

1、fatal error C1010: unexpected end of file while looking for precompiled header directive。

  寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")

  2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory

  不能打开包含文件“R…….h”:没有这样的文件或目录。

  3、error C2011: 'C……': 'class' type redefinition

  类“C……”重定义。

  4、error C2018: unknown character '0xa3'

  不认识的字符'0xa3'。(一般是汉字或中文标点符号)

  5、error C2057: expected constant expression

  希望是常量表达式。(一般出现在switch语句的case分支中)

  6、error C2065: 'IDD_MYDIALOG' : undeclared identifier

  “IDD_MYDIALOG”:未声明过的标识符。

  7、error C2082: redefinition of formal parameter 'bReset'

  函数参数“bReset”在函数体中重定义。

  8、error C2143: syntax error: missing ':' before '{'

  句法错误:“{”前缺少“;”。

  9、error C2146: syntax error : missing ';' before identifier 'dc'

  句法错误:在“dc”前丢了“;”。

  10、error C2196: case value '69' already used

  值69已经用过。(一般出现在switch语句的case分支中)

11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'

  成员函数“OnTimer”没有在“CHelloView”中声明。

  12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'

  重载的函数“void reset(int)”在类“B”中找不到。

  13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention

  类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。

  14、error C2660: 'SetTimer' : function does not take 2 parameters

  “SetTimer”函数不传递2个参数。

  15、warning C4035: 'f……': no return value

  “f……”的return语句没有返回值。

  16、warning C4553: '= =' : operator has no effect; did you intend '='?

  没有效果的运算符“= =”;是否改为“=”?

  17、warning C4700: local variable 'bReset' used without having been initialized

  局部变量“bReset”没有初始化就使用。

  18、error C4716: 'CMyApp::InitInstance' : must return a value

  “CMyApp::InitInstance”函数必须返回一个值。

  19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing

  连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)

  20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"

  连接时发现没有实现的外部符号(变量、函数等)。

  function call missing argument list 调用函数的时候没有给参数。

  member function definition looks like a ctor, but name does not match enclosing class 成员函数声明了但没有使用

  unexpected end of file while looking for precompiled header directive 在寻找预编译头文件时文件意外结束,编译不正常终止可能造成这种情况

[zz] 编译开源代码的方法

今天在折腾libjpeg,这是一个开源的JPG文件的编码函数库。因为DirectX中提供了完善的图像文件格式支持,而OpenGL在这方面却显得非常简陋,只好自己来写JPG文件读取函数。而且libjpeg只提供了从文件读取的函数,无法处理内存中的数据,也就是说在处理打包的资源时会比较麻烦。幸好已经有高手写出了修改libjpeg代码的方法,需要重新编译libjpeg.lib。在修改之前先尝试了用命令行(Visual C++ 2008 Express Edition)来编译代码,遇到了一些问题,还好都不是大问题,都解决了,呵呵,赶紧记下来免得忘了。


1、从ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6.zip下载libjpeg的源代码

2、解压出来一堆文件,打开命令行窗口(CMD),进入代码所放的目录下

3、运行命令:nmake /f makefile.vc nodebug=1 开始编译,然后问题就来了

4、“nmake 不是内部或外部命令”
    这个执行文件在VC的安装目录中,解决方法:输入命令 path C:\Program Files\Microsoft Visual Studio 9.0\VC\bin 回车

5、makefile.vc<11>:fatal error U1052: file 'win32.mak' not found
    提示找不到win32.mak文件,这个文件定义了一些必须的宏,这个文件在Windows SDK的安装目录中,打开makefile.vc文件修改第12行为:
    !include <C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\win32.mak>
    保存,再执行编译命令又有新的错误。

6、NMAKE:fatal error U1073: don't know how to make 'jconfig.h'
    这是个奇怪的问题,在网上搜了半天没有结果,最后才发现原来目录中没有这个文件。其实只要把文件jconfig.vc更名为jconig.h即可。再执行编译命令又有新的错误。

7、NMAKE: fatal error U1077: '...\cl.EXE' : return code '0xc0000135'
    CL命令未能执行,我们直接在命令行提示后面输入cl回车,会有个提示“没有找到 mspdb80.dll ”。解决方法:输入 vcvars32 回车,这是一个用来设置VC路径环境的批处理。再次执行编译命令,出现了一行行字符快速的刷新,哈哈,已经开始编译了。最后又出现一个错误,这个就不用管它了,因为我们需要的libjpeg.lib文件已经出现在了当前目录中。

January 09

看到的几句话,觉得有点道理。

1.幸福,不在于拥有的多,而在于要求的少。

2.常常大家想得到的幸福不是真的幸福,而是“比别人幸福”,其实你已经很幸福。

December 15

退而结网

   我一直在告诫自己”与其临渊羨魚,不如退而結网”,但实际上我执行的很不好,每每有点时间都是在徘徊蹉跎,想想再过几年我就很难再有这么多的闲余时间来学习,来发展兴趣爱好。Just do it。

December 13

Lenovo OEM Windows 7 Ultimate 旗舰版x86

电驴资源

下面是用户共享的文件列表,安装电驴后,您可以点击这些文件名进行下载

rayfile 下载网页:http://www.rayfile.com/files/491c254f-c67e-11de-ab89-0014221b798a/

电驴下载地址:ed2k://|file|LENOVO_WIN7_UM_32_ZH_CN_RDVD.iso|2829281280|1e4fc97988ed20988e4335420fa6beda|
2.6GB

[资源名称]---Lenovo OEM Windows 7 Ultimate 32BIT
[资源类型]---ISO
[资源语言]---简体中文
[杀毒状况]---无
[共享时间]---2009.11.1
[安装测试]---测试通过
[版权声明]---软件版权归原作者及原软件公司所有,如果你喜欢,请购买正版软件
[相关图片]
IPB Image
IPB Image
IPB Image
IPB Image
IPB Image
IPB Image
IPB Image
IPB Image
IPB Image
[资源介绍]
联想官方WINDOWS 7旗舰版(32位)!
File:\LENOVO_WIN7_UM_32_ZH_CN_RDVD.iso
Size: 2829281280 bytes
MD5: F0040D3F268B39DB17D9B000E69FAA0D
SHA1: 46D524BB069115FB8C4C765723B30764943718D5
CRC32: D8F2E0BB
联想最新 OEM密钥
KEY:6K2KY-BFH24-PJW6W-9GK29-TMPWP
特别提醒:
联想的这几个OEM版硬盘安装的话有可能出错,刻盘或用UltraISO写入到U盘安装就不会有问题!
关于本资源的一些疑问,为什么不可以硬盘安装:
OEM原版装完有LOGO,不需要在安装时输入KEY,对于LENOVO SLIC2.1的机子,装完自动激活,这都是共识、常识。这是所有OEM版与MSDN的共同区别,不提也罢。
整理一下的区别:
1、 LENOVO的install.wim中有5个映像,都是英文版的,第5个映像是旗版,添加了简体中文语言包。所以WIM文件比MSDN的大好几百M。 MSDN的install.wim中有5个映像,都是中文版的。为什么删除了SOUCES目录下的EI.CFG,也不会出现5个版本,是因为 BOOT.WIM中有个lenovo文件夹,而安装程序指定到这里寻找安装配置文件(不信你改一下LENOVO文件夹的名字,安装时准保你出错),而安装配置文件autoUnattend.xml的SLP KEY界定了安装的是什么版本。所以要改成五个版(1个双语4个英文)能选择,用这种办法来配置五个KEY没那么容易,改成别的方法会简单一些。
2、安装功能:LENOVO只能光盘启动安装(或U盘启动),硬盘安装和PE安装得借助非微软的第三方工具,这样才能调用BOOT.WIM,才能自动激活,如果不借助第三方工具,安装出来的不会激活,也没有OEMLOGO。。非U版的LENOVO连硬盘安装都不可以,会出错。
而MSDN安装功能齐全,具备所有的安装功能,但不好的地方是安装还得自己导入KEY和证书,稍麻烦一点。也没有OEMLOGO,这对LOGO爱好者很重要,一般人无所谓,这不是激活必备的。
3、 LENOVO的BOOT.WIM中sources中lang.ini设定安装语言为中文,其实改lang.ini中设置,加一行EN-US = 2,就可以出现双语选择,这样你就可以得到一个英文界面的联想OEM版,不过安装完的系统仍带有中文包,可以在控制面板中切换语言或删除不用的语言(非U 版LENOVO不行)。MSDN的因为只有一种语言,所以lang.ini默认设定是中文语言,修改添加内容,就是出现双语选择界面,也是安装不出英文版。

联想 Lenovo OEM Windows 7 Home Premium 32BIT 家庭高级版
http://www.VeryCD.com/groups/0202/758062.topic

December 09

敏捷开发中的Code Review

敏捷开发中的Code Review

一些敏捷团队在实施敏捷开发中忙于编码、忙于Unit Test、忙于沟通、忙于Build等,虽然也有编码审核阶段,但大都浮于表面,流于形式,效果不佳。本文结合实践,介绍笔者对敏捷开发中CodeReview的理解和相关经验。

文/陈序明 黄彦军

敏捷开 发中Code Review的目的及内容

做任何事情,首先要清晰为什么要做,才能有目标和动力把事情做得更好,Code Review 也是如此。只有清晰明确了敏捷团队进行CodeReview 的动机,才能以此为方向开展后续工作。下面我们推荐的敏捷开发中常见的Code Review的目的:

设计合理性Review

在笔者的另一篇文章中《敏捷开发中的架构设计》谈到,敏捷开发中崇尚Code is design,对开发人员提出了比以往更高的要求,即需要开发人员不断地重构出合理的设计。所以敏捷开发中的Code Review也需要承担一部分“结对设计”和“设计把关”的职责。

这部分的Code Review 包括:设计的合理性(如实现方法,数据结构,设计模式,扩展性考虑等),是否存在大量重复代码和其他组件是否有重复的代码,包结构设计是否合理等。

笔者了解的一些项目中, 进行敏捷开发后, 提高了开发效率, 但是设计的质量却下降了。如Repeat Yourself 的现象(特别是跨组件之间的Repeat Yourself 现象);更有甚者,在笔者看到一个某银行的应用中(不是国内的),数据库连接和操作是直接在JSP中写SQL语句。

像这些Bad Design 的例子还是很多的。这些在重构的时候应该由开发人员解决。但考虑到不同开发人员之间技术功底不一,很有必要在Code Review阶段进行Review和讨论。

互为Backup

这是很容易被忽略,但是又很重要的一个Code Review的目的。

我们知道,敏捷开发中强调高质量的代码胜过详细的文档,所以某种程度上来说Code is Document。敏捷开发中的代码承担了一部分Document的职责,即传递技术的作用。

Code Review 中,Review 的开发人员了解代码的设计和实现,传递了技术,开发人员互为Backup,方便后期的维护,也减少了项目风险。

分享知识、设计、技术

这也是很容易被忽略的一个很重要的目的。敏捷开发是一个中央集中控制到个体发挥积极性的过程,中央集中控制的优点就是有统一的视图和控制,经常开大会,开长会,这样知识和经验也较容易集中。敏捷开发中,分散在两个Scrum Team的开发人员之间,如果没有好的机制,相互沟通也会相对较少,造成知识和好的经验无法在整个团队传播。

笔者参加的项目中就碰到了类似情况, 当时我们整个团队分成三个Scrum Team,其中一个Scrum Team负责一个Eclipse 工具的开发, 其中用到的一些功能和知识在其他ScrumTeam上以前都有涉及过。当时负责开发的同事非常优秀而且能力突出,但由于不知道其他Scrum Team同事有这方面的经验,没有很好地分享以往好的经验和知识,以至于最后导致浪费了一些学习的成本。

Code Review是一个学习和享受的过程,一个开发人员的能力有限,而Code Review正是这样的一种机制,让好的知识、设计在团队中分享,实现整体团队的成长和整体的效益最大化。

代码可读性

如上所说,敏捷开发中强调高质量的代码胜过冗余的文档,所以Code某种程度上是Document。敏捷开发中,代码的要求不止是能运行功能正确的代码,而是有了更高的要求,即Code for maintenance。

可维护的代码,需要清晰,可读性强,这里可读性代码检查不是指代码格式(代码格式可以通过工具检查出),而是指代码语义。在笔者的文章《软件可消费性设计》中有一些这方面的讨论和建议。

Code中的“地雷区”Review

代码中的逻辑,除了业务逻辑,还应该包括技术逻辑。技术逻辑就是实现逻辑, 比如数据库连接打开是否忘记关闭,是否正确使用线程,Exception 处理,密码是否加密存储等。

我把这些最常出现错误的地方,而且是测试不容易发现的地方,称为Code中的“地雷区”。这些“地雷区”在Code Review 中是值得花费一些时间进行维护和检查的。

建议,在整个团队中维护并共享“地雷区”注意事项列表,以及统一的处理方式和机制。并在编码和Code Review过程中都按照团队的最佳实践进行。

发现代码中的业务逻辑错误

业务逻辑指的是代码开发的功能是否符合业务需求,如一个加法函数,检查其是否真的实现了加法的功能。

笔者了解的一些敏捷团队中,把发现代码的业务逻辑错误当做目标和内容,但往往效果都不是很好,基本都是从形式上泛泛检查一番。原因有两个:

1.业务逻辑的检查是从需求到代码的全方位检查,需要花费大量时间,投入产出比失衡。

2.业务逻辑的检查和业务需求紧密关联,已经超出了检查人员的能力范围(一般Code Review是开发人员,不是业务人员)。

笔者认为,发现逻辑错误,不应该是Code Review 的目的和内容。应该是Unit Test,功能测试,集成测试的目的。从投入产出比考虑,不应该花费太多时间在Code Review 阶段去进行逻辑错误检查。

敏捷开发中不推荐的Code Review的目的及内容

下面还有一些常见的Code Review目的和内容被很多团队广泛使用,但作者认为这些并不是敏捷开发中的主要目的和内容,团队应该把时间花费在重要的目的和内容上,而不应该投入精力在下面的这些Code Review目的和内容上。

发现性能问题

有些团队把性能问题,也作为Code Review的目的和内容之一,然后提出一些如String应该使用StringBuilder,而不能使用+,类似这样的看似有用其实无用建议。

笔者认为,性能问题是需要量化的衡量和精确定位, 很难通过Code Review检查出来。而一些粗浅的性能问题可以通过一些工具方便地扫描出来,而无须花费时间去进行Code Review。

如图1是RAD V7.0 (IBM Rati onal Application Developer) 中的Software Analyzer工具带有的Performance检查:

图1 RAD Software Analyzer中的Performance检查

图1 RAD Software Analyzer中的Performance检查

所以笔者认为,开发人员提交的代码,需要是经过工具检查后的代码。而代码审核人员则无须花费时间在性能相关的Code Review 上。具体的性能问题交给性能测试。

发现开源的授权法律问题

开源软件也可以借助一些检查工具, 统一通过工具扫描, 无需在Code Review 阶段花费时间。

其他问题,如国际化,J2EE Best Practice等

这些问题开发人员可以在提交代码之前通过工具发现和解决, 不是Code Review 阶段的职责和目的,也无须花费时间去处理。

像FindBugs 和RAD 这样的工具就具备类似的代码检查功能,如RADV7.0 中的Software Analyzer 工具带有如下的检查功能:

图2 RAD Software Analyzer中检查规则列表

图2 RAD Software Analyzer中检查规则列表

1.设计原则(5):用于面向对象编程的设计原则的规则。

2.全球化(47):基于全球化编码最佳实践的规则,有助于确保代码在局部环境中正确地运行。

3.J2EE 最佳实践(32):基于最佳的 Java™ 2 Platform Enterprise Edition( J2EE)开发实践的规则,以及支持瞄准 IBM® WebSphere® 服务的Web 项目的规则;

4.J2EE 安全性(17):验证代码符合 J2EE 技术安全性需要的规则;

5.J2SE 最佳实践(71):基于最佳的 Java™2 Platform Standard Edition (J2SE)开发实践的规则;

6.J2SE 安全性(9):验证代码符合 J2SE 技术安全性需要的规则;

7.命名(2):关于 Java 代码中命名约定的规则;

8.性能(26):加强在 Java 应用程序中提高性能和减少存储器足迹的建议的规则;

9.私有 API (3):定位那些不属于 Java 代码的 API 的规则。

敏捷开发中如何开展Code Review

在清晰明确了敏捷团队进行Code Review 的目的和内容后,下面介绍如何有效地开展Code Review。

沟通、协作、互助、学习的团队氛围

Code Review 中,Review 人员和开发人员不是对立的关系,而是互助、沟通、协作和学习的过程。团队形成互助、互学的气氛,既能互相增长团队的知识和经验,还能把产品做得更好。

Code Review协作过程:

a)先由代码的开发人员向检查人员进行大体的介绍,包括设计思想、数据结构、程序代码结构介绍等。

b)双方进行讨论、交流。

c)检查人员单独进一步进行Code Review,并记录Review结果和建议。

d)由检查人员和开发人员一起,检查人员反馈Code Review结果,并和开发人员一起讨论改进方法,重构。

e)最后把可重用的Code Review的经验总结编码规范,或者记录到“地雷区”中。便于整个团队复用经验。

图3 Code Review是沟通、协作、互助和学习的过程

图3 Code Review是沟通、协作、互助和学习的过程

开展以上过程可以以开发人员为主,辅助以工具。但无须规定系列的文档、流程、Check List 等,这反而会影响开发人员的积极性。

Code Review是发现问题的过程,同时也是学习和交流过程。需要是灵活、自由、主动的态度,而不是行政上的控制和规章流程。笔者建议:和敏捷开发的核心思想一致,让团队明确Code Review 的思想、作用和目的内容后,充分发挥个体的积极性和学习分享的动力。随时随地地进行Code Review,讨论,重构,改进。

增量式Review

大家都知道,软件开发中存在长鞭效应,即一个问题越在后期发现造成的影响会越大,Code Review 也是

如此,如图4所示:

图 4 Code Review中的长鞭效应

图 4 Code Review中的长鞭效应

软件的开发过程中, 应该阶段性地进行Code Review,而不是等到所有代码都开发完毕后再做一次性的Code Review。那时如果发现问题,造成的改动成本比增量式的检查来的大得多。

笔者了解的一些开发团队,他们在软件开发完毕,并测试后,才临时确定Code Review的人员,然后再安排半天左右的时间进行Code Review。结果尽管发现一些结构或设计方面问题,但由于修改成本大,也无法进行改进。

正确的方式是,在早期就参与设计开发过程,抱着互助、沟通、协作、学习的思想,阶段性的参与讨论、学习并贡献自己的意见。具体Review的频率、次数则可以由开发人员抱着主动、积极的态度,按照敏捷的思想自己去把握决定。

利用工具进行Code Inspection

有很多的工具可以辅助Code Review :

1.如代码格式检查Checkstyle 工具,检查如过大的类、太长的方法和未使用的变量等这样违反编程规范的问题。

2.RAD中的Software Analyzer工具,可以基于规则进行国际化、J2EE最佳实践、性能、安全等检查。3.CSAR,用于扫描代码检查开源软件等。

4.JDepend,可以检查包依赖关系。

5.CPD工具,Eclipse 的 PMD 插件提供了一项叫做 CPD(或复制粘贴探测器)的功能,用于寻找重复的代码。

6.Eclipse 的Metrics 插件,提供了很多有效地查出代码复杂度的功能。

辅助以工具和自动化流程,能花很少时间轻松完成很多基本的Code Inspection 工作。让团队有更多的时间和精力去做更重要的Code Review。

持续自动化Code Inspection

工具检查可以由开发人员自行检查并修正, 但一种更可持续的做法是自动化的集成工具进行Code Inspection,可以通过自动化脚本在每日进行Build 前进行扫描,并呈现报告给相应人员。

Code Review协作工具

为了快速有效地进行人工Code Review协作,可以使用诸如Jupiter这样的工具辅助进行。可以帮助开发人员有效管理Code Review任务、问题、建议等。

总结

Code Review 的核心是:互助,沟通,协作,学习的过程,这是一个美妙而享受的过程,是跨越需求分析、架构设计、编码等各阶段的过程。敏捷团队应该统一达成Code Review 对产品、对团队、对个人的巨大好处的共识,发挥出个体的积极性,相信会改变“流于形式”的现状,发挥Code Review巨大的威力。

本文来自《程序员》杂志0912期)

December 07

[zz经典] 堆和栈的区别

非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!

堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。 

2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 

2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 

2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。 

2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 

2.6存取效率的比较 

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。 

2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 

windows进程中的内存结构

在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 

接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 

首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式。先来看下面这段代码: 

#include <stdio.h> 

int g1=0, g2=0, g3=0; 

int main()
{
static int s1=0, s2=0, s3=0;
int v1=0, v2=0, v3=0; 

//打印出各个变量的内存地址 

printf("0x%08x\n",&v1); //打印各本地变量的内存地址
printf("0x%08x\n",&v2);
printf("0x%08x\n\n",&v3);
printf("0x%08x\n",&g1); //打印各全局变量的内存地址
printf("0x%08x\n",&g2);
printf("0x%08x\n\n",&g3);
printf("0x%08x\n",&s1); //打印各静态变量的内存地址
printf("0x%08x\n",&s2);
printf("0x%08x\n\n",&s3);
return 0;

编译后的执行结果是: 

0x0012ff78
0x0012ff7c
0x0012ff80 

0x004068d0
0x004068d4
0x004068d8 

0x004068dc
0x004068e0
0x004068e4 

输出的结果就是变量的内存地址。其中v1,v2,v3是本地变量,g1,g2,g3是全局变量,s1,s2,s3是静态变量。你可以看到这些变量在内存是连续分布的,但是本地变量和全局变量分配的内存地址差了十万八千里,而全局变量和静态变量分配的内存是连续的。这是因为本地变量和全局/静态变量是分配在不同类型的内存区域中的结果。对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈 (stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 

├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域 

堆栈是一个先进后出的数据结构,栈顶地址总是小于等于栈的基地址。我们可以先了解一下函数调用的过程,以便对堆栈在程序中的作用有更深入的了解。不同的语言有不同的函数调用规定,这些因素有参数的压入规则和堆栈的平衡。windows API的调用规则和ANSI C的函数调用规则是不一样的,前者由被调函数调整堆栈,后者由调用者调整堆栈。两者通过“__stdcall”和“__cdecl”前缀区分。先看下面这段代码: 

#include <stdio.h> 

void __stdcall func(int param1,int param2,int param3)
{
int var1=param1;
int var2=param2;
int var3=param3;
printf("0x%08x\n",¶m1); //打印出各个变量的内存地址
printf("0x%08x\n",¶m2);
printf("0x%08x\n\n",¶m3);
printf("0x%08x\n",&var1);
printf("0x%08x\n",&var2);
printf("0x%08x\n\n",&var3);
return;

int main()
{
func(1,2,3);
return 0;

编译后的执行结果是: 

0x0012ff78
0x0012ff7c
0x0012ff80 

0x0012ff68
0x0012ff6c
0x0012ff70 

├———————┤<—函数执行时的栈顶(ESP)、低端内存区域
│ …… │
├———————┤
│ var 1 │
├———————┤
│ var 2 │
├———————┤
│ var 3 │
├———————┤
│ RET │
├———————┤<—“__cdecl”函数返回后的栈顶(ESP)
│ parameter 1 │
├———————┤
│ parameter 2 │
├———————┤
│ parameter 3 │
├———————┤<—“__stdcall”函数返回后的栈顶(ESP)
│ …… │
├———————┤<—栈底(基地址 EBP)、高端内存区域 

上图就是函数调用过程中堆栈的样子了。首先,三个参数以从又到左的次序压入堆栈,先压“param3”,再压“param2”,最后压入“param1”;然后压入函数的返回地址(RET),接着跳转到函数地址接着执行(这里要补充一点,介绍UNIX下的缓冲溢出原理的文章中都提到在压入RET后,继续压入当前EBP,然后用当前ESP代替EBP。然而,有一篇介绍windows下函数调用的文章中说,在windows下的函数调用也有这一步骤,但根据我的实际调试,并未发现这一步,这还可以从param3和var1之间只有4字节的间隙这点看出来);第三步,将栈顶(ESP)减去一个数,为本地变量分配内存空间,上例中是减去12字节(ESP=ESP-3*4,每个int变量占用4个字节);接着就初始化本地变量的内存空间。由于“__stdcall”调用由被调函数调整堆栈,所以在函数返回前要恢复堆栈,先回收本地变量占用的内存(ESP=ESP+3*4),然后取出返回地址,填入EIP寄存器,回收先前压入参数占用的内存(ESP=ESP+3*4),继续执行调用者的代码。参见下列汇编代码: 

;--------------func 函数的汇编代码------------------- 

:00401000 83EC0C sub esp, 0000000C //创建本地变量的内存空间
:00401003 8B442410 mov eax, dword ptr [esp+10]
:00401007 8B4C2414 mov ecx, dword ptr [esp+14]
:0040100B 8B542418 mov edx, dword ptr [esp+18]
:0040100F 89442400 mov dword ptr [esp], eax
:00401013 8D442410 lea eax, dword ptr [esp+10]
:00401017 894C2404 mov dword ptr [esp+04], ecx 

……………………(省略若干代码) 

:00401075 83C43C add esp, 0000003C ;恢复堆栈,回收本地变量的内存空间
:00401078 C3 ret 000C ;函数返回,恢复参数占用的内存空间
;如果是“__cdecl”的话,这里是“ret”,堆栈将由调用者恢复 

;-------------------函数结束------------------------- 

;--------------主程序调用func函数的代码-------------- 

:00401080 6A03 push 00000003 //压入参数param3
:00401082 6A02 push 00000002 //压入参数param2
:00401084 6A01 push 00000001 //压入参数param1
:00401086 E875FFFFFF call 00401000 //调用func函数
;如果是“__cdecl”的话,将在这里恢复堆栈,“add esp, 0000000C” 

聪明的读者看到这里,差不多就明白缓冲溢出的原理了。先来看下面的代码: 

#include <stdio.h>
#include <string.h> 

void __stdcall func()
{
char lpBuff[8]="\0";
strcat(lpBuff,"AAAAAAAAAAA");
return;

int main()
{
func();
return 0;

编译后执行一下回怎么样?哈,“"0x00414141"指令引用的"0x00000000"内存。该内存不能为"read"。”,“非法操作”喽! "41"就是"A"的16进制的ASCII码了,那明显就是strcat这句出的问题了。"lpBuff"的大小只有8字节,算进结尾的\0,那 strcat最多只能写入7个"A",但程序实际写入了11个"A"外加1个\0。再来看看上面那幅图,多出来的4个字节正好覆盖了RET的所在的内存空间,导致函数返回到一个错误的内存地址,执行了错误的指令。如果能精心构造这个字符串,使它分成三部分,前一部份仅仅是填充的无意义数据以达到溢出的目的,接着是一个覆盖RET的数据,紧接着是一段shellcode,那只要着个RET地址能指向这段shellcode的第一个指令,那函数返回时就能执行shellcode了。但是软件的不同版本和不同的运行环境都可能影响这段shellcode在内存中的位置,那么要构造这个RET是十分困难的。一般都在RET和shellcode之间填充大量的NOP指令,使得exploit有更强的通用性。 

├———————┤<—低端内存区域
│ …… │
├———————┤<—由exploit填入数据的开始
│ │
│ buffer │<—填入无用的数据
│ │
├———————┤
│ RET │<—指向shellcode,或NOP指令的范围
├———————┤
│ NOP │
│ …… │<—填入的NOP指令,是RET可指向的范围
│ NOP │
├———————┤
│ │
│ shellcode │
│ │
├———————┤<—由exploit填入数据的结束
│ …… │
├———————┤<—高端内存区域 

windows下的动态数据除了可存放在栈中,还可以存放在堆中。了解C++的朋友都知道,C++可以使用new关键字来动态分配内存。来看下面的C++代码: 

#include <stdio.h>
#include <iostream.h>
#include <windows.h> 

void func()
{
char *buffer=new char[128];
char bufflocal[128];
static char buffstatic[128];
printf("0x%08x\n",buffer); //打印堆中变量的内存地址
printf("0x%08x\n",bufflocal); //打印本地变量的内存地址
printf("0x%08x\n",buffstatic); //打印静态变量的内存地址

void main()
{
func();
return;

程序执行结果为: 

0x004107d0
0x0012ff04
0x004068c0 

可以发现用new关键字分配的内存即不在栈中,也不在静态数据区。VC编译器是通过windows下的“堆(heap)”来实现new关键字的内存动态分配。在讲“堆”之前,先来了解一下和“堆”有关的几个API函数: 

HeapAlloc 在堆中申请内存空间
HeapCreate 创建一个新的堆对象
HeapDestroy 销毁一个堆对象
HeapFree 释放申请的内存
HeapWalk 枚举堆对象的所有内存块
GetProcessHeap 取得进程的默认堆对象
GetProcessHeaps 取得进程所有的堆对象
LocalAlloc
GlobalAlloc 

当进程初始化时,系统会自动为进程创建一个默认堆,这个堆默认所占内存的大小为1M。堆对象由系统进行管理,它在内存中以链式结构存在。通过下面的代码可以通过堆动态申请内存空间: 

HANDLE hHeap=GetProcessHeap();
char *buff=HeapAlloc(hHeap,0,8); 

其中hHeap是堆对象的句柄,buff是指向申请的内存空间的地址。那这个hHeap究竟是什么呢?它的值有什么意义吗?看看下面这段代码吧: 

#pragma comment(linker,"/entry:main") //定义程序的入口
#include <windows.h> 

_CRTIMP int (__cdecl *printf)(const char *, ...); //定义STL函数printf
/*---------------------------------------------------------------------------
写到这里,我们顺便来复习一下前面所讲的知识:
(*注)printf函数是C语言的标准函数库中函数,VC的标准函数库由msvcrt.dll模块实现。
由函数定义可见,printf的参数个数是可变的,函数内部无法预先知道调用者压入的参数个数,函数只能通过分析第一个参数字符串的格式来获得压入参数的信息,由于这里参数的个数是动态的,所以必须由调用者来平衡堆栈,这里便使用了__cdecl调用规则。BTW,Windows系统的API函数基本上是 __stdcall调用形式,只有一个API例外,那就是wsprintf,它使用__cdecl调用规则,同printf函数一样,这是由于它的参数个数是可变的缘故。
---------------------------------------------------------------------------*/
void main()
{
HANDLE hHeap=GetProcessHeap();
char *buff=HeapAlloc(hHeap,0,0x10);
char *buff2=HeapAlloc(hHeap,0,0x10);
HMODULE hMsvcrt=LoadLibrary("msvcrt.dll");
printf=(void *)GetProcAddress(hMsvcrt,"printf");
printf("0x%08x\n",hHeap);
printf("0x%08x\n",buff);
printf("0x%08x\n\n",buff2);

执行结果为: 

0x00130000
0x00133100
0x00133118 

hHeap 的值怎么和那个buff的值那么接近呢?其实hHeap这个句柄就是指向HEAP首部的地址。在进程的用户区存着一个叫PEB(进程环境块)的结构,这个结构中存放着一些有关进程的重要信息,其中在PEB首地址偏移0x18处存放的ProcessHeap就是进程默认堆的地址,而偏移0x90处存放了指向进程所有堆的地址列表的指针。windows有很多API都使用进程的默认堆来存放动态数据,如windows 2000下的所有ANSI版本的函数都是在默认堆中申请内存来转换ANSI字符串到Unicode字符串的。对一个堆的访问是顺序进行的,同一时刻只能有一个线程访问堆中的数据,当多个线程同时有访问要求时,只能排队等待,这样便造成程序执行效率下降。 

最后来说说内存中的数据对齐。所位数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍,DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽,x86 CPU能直接访问对齐的数据,当他试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。同样一段代码,我们来看看用VC、Dev-C++和lcc三个不同编译器编译出来的程序的执行结果: 

#include <stdio.h> 

int main()
{
int a;
char b;
int c;
printf("0x%08x\n",&a);
printf("0x%08x\n",&b);
printf("0x%08x\n",&c);
return 0;

这是用VC编译后的执行结果:
0x0012ff7c
0x0012ff7b
0x0012ff80
变量在内存中的顺序:b(1字节)-a(4字节)-c(4字节)。 

这是用Dev-C++编译后的执行结果:
0x0022ff7c
0x0022ff7b
0x0022ff74
变量在内存中的顺序:c(4字节)-中间相隔3字节-b(占1字节)-a(4字节)。 

这是用lcc编译后的执行结果:
0x0012ff6c
0x0012ff6b
0x0012ff64
变量在内存中的顺序:同上。 

三个编译器都做到了数据对齐,但是后两个编译器显然没VC“聪明”,让一个char占了4字节,浪费内存哦。 

基础知识:
堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从 EIP寄存器中读取下一条指令的内存地址,然后继续执行。 

参考:《Windows下的HEAP溢出及其利用》by: isno
《windows核心编程》by: Jeffrey Richter 

摘要: 讨论常见的堆性能问题以及如何防范它们。(共 9 页)

前言
您是否是动态分配的 C/C++ 对象忠实且幸运的用户?您是否在模块间的往返通信中频繁地使用了“自动化”?您的程序是否因堆分配而运行起来很慢?不仅仅您遇到这样的问题。几乎所有项目迟早都会遇到堆问题。大家都想说,“我的代码真正好,只是堆太慢”。那只是部分正确。更深入理解堆及其用法、以及会发生什么问题,是很有用的。

什么是堆?
(如果您已经知道什么是堆,可以跳到“什么是常见的堆性能问题?”部分)

在程序中,使用堆来动态分配和释放对象。在下列情况下,调用堆操作: 

事先不知道程序所需对象的数量和大小。

对象太大而不适合堆栈分配程序。
堆使用了在运行时分配给代码和堆栈的内存之外的部分内存。下图给出了堆分配程序的不同层。

GlobalAlloc/GlobalFree:Microsoft Win32 堆调用,这些调用直接与每个进程的默认堆进行对话。

LocalAlloc/LocalFree:Win32 堆调用(为了与 Microsoft Windows NT 兼容),这些调用直接与每个进程的默认堆进行对话。

COM 的 IMalloc 分配程序(或 CoTaskMemAlloc / CoTaskMemFree):函数使用每个进程的默认堆。自动化程序使用“组件对象模型 (COM)”的分配程序,而申请的程序使用每个进程堆。

C/C ++ 运行时 (CRT) 分配程序:提供了 malloc() 和 free() 以及 new 和 delete 操作符。如  Microsoft Visual Basic 和 Java 等语言也提供了新的操作符并使用垃圾收集来代替堆。CRT 创建自己的私有堆,驻留在  Win32 堆的顶部。

Windows NT 中,Win32 堆是 Windows NT 运行时分配程序周围的薄层。所有 API 转发它们的请求给 NTDLL。

Windows NT 运行时分配程序提供 Windows NT 内的核心堆分配程序。它由具有 128 个大小从 8 到 1,024 字节的空闲列表的前端分配程序组成。后端分配程序使用虚拟内存来保留和提交页。

在图表的底部是“虚拟内存分配程序”,操作系统使用它来保留和提交页。所有分配程序使用虚拟内存进行数据的存取。

分配和释放块不就那么简单吗?为何花费这么长时间?

堆实现的注意事项
传统上,操作系统和运行时库是与堆的实现共存的。在一个进程的开始,操作系统创建一个默认堆,叫做“进程堆”。如果没有其他堆可使用,则块的分配使用“进程堆”。语言运行时也能在进程内创建单独的堆。(例如,C 运行时创建它自己的堆。)除这些专用的堆外,应用程序或许多已载入的动态链接库 (DLL) 之一可以创建和使用单独的堆。Win32 提供一整套 API 来创建和使用私有堆。有关堆函数(英文)的详尽指导,请参见 MSDN。

当应用程序或 DLL 创建私有堆时,这些堆存在于进程空间,并且在进程内是可访问的。从给定堆分配的数据将在同一个堆上释放。(不能从一个堆分配而在另一个堆释放。)

在所有虚拟内存系统中,堆驻留在操作系统的“虚拟内存管理器”的顶部。语言运行时堆也驻留在虚拟内存顶部。某些情况下,这些堆是操作系统堆中的层,而语言运行时堆则通过大块的分配来执行自己的内存管理。不使用操作系统堆,而使用虚拟内存函数更利于堆的分配和块的使用。

典型的堆实现由前、后端分配程序组成。前端分配程序维持固定大小块的空闲列表。对于一次分配调用,堆尝试从前端列表找到一个自由块。如果失败,堆被迫从后端(保留和提交虚拟内存)分配一个大块来满足请求。通用的实现有每块分配的开销,这将耗费执行周期,也减少了可使用的存储空间。

Knowledge Base  文章 Q10758,“用 calloc() 和 malloc() 管理内存” (搜索文章编号), 包含了有关这些主题的更多背景知识。另外,有关堆实现和设计的详细讨论也可在下列著作中找到:“Dynamic Storage Allocation:  A Survey and Critical Review”,作者 Paul R. Wilson、Mark S. Johnstone、 Michael Neely 和 David Boles; “International Workshop on Memory Management”, 作者 Kinross, Scotland, UK,  1995 年 9 月(http://www.cs.utexas.edu/users/oops/papers.html)(英文)。

Windows NT  的实现(Windows NT 版本 4.0 和更新版本) 使用了 127 个大小从 8 到 1,024 字节的 8 字节对齐块空闲列表和一个“大块”列表。“大块”列表(空闲列表[0]) 保存大于 1,024 字节的块。空闲列表容纳了用双向链表链接在一起的对象。默认情况下,“进程堆”执行收集操作。(收集是将相邻空闲块合并成一个大块的操作。)收集耗费了额外的周期,但减少了堆块的内部碎片。

单一全局锁保护堆,防止多线程式的使用。(请参见“Server Performance and Scalability Killers”中的第一个注意事项, George Reilly 所著,在 “MSDN Online Web Workshop”上(站点:http://msdn.microsoft.com/workshop/server/iis/tencom.asp(英文)。)单一全局锁本质上是用来保护堆数据结构,防止跨多线程的随机存取。若堆操作太频繁,单一全局锁会对性能有不利的影响。

什么是常见的堆性能问题?
以下是您使用堆时会遇到的最常见问题: 

分配操作造成的速度减慢。光分配就耗费很长时间。最可能导致运行速度减慢原因是空闲列表没有块,所以运行时分配程序代码会耗费周期寻找较大的空闲块,或从后端分配程序分配新块。

释放操作造成的速度减慢。释放操作耗费较多周期,主要是启用了收集操作。收集期间,每个释放操作“查找”它的相邻块,取出它们并构造成较大块,然后再把此较大块插入空闲列表。在查找期间,内存可能会随机碰到,从而导致高速缓存不能命中,性能降低。

堆竞争造成的速度减慢。当两个或多个线程同时访问数据,而且一个线程继续进行之前必须等待另一个线程完成时就发生竞争。竞争总是导致麻烦;这也是目前多处理器系统遇到的最大问题。当大量使用内存块的应用程序或 DLL 以多线程方式运行(或运行于多处理器系统上)时将导致速度减慢。单一锁定的使用—常用的解决方案—意味着使用堆的所有操作是序列化的。当等待锁定时序列化会引起线程切换上下文。可以想象交叉路口闪烁的红灯处走走停停导致的速度减慢。
竞争通常会导致线程和进程的上下文切换。上下文切换的开销是很大的,但开销更大的是数据从处理器高速缓存中丢失,以及后来线程复活时的数据重建。

堆破坏造成的速度减慢。造成堆破坏的原因是应用程序对堆块的不正确使用。通常情形包括释放已释放的堆块或使用已释放的堆块,以及块的越界重写等明显问题。(破坏不在本文讨论范围之内。有关内存重写和泄漏等其他细节,请参见 Microsoft Visual C++(R) 调试文档 。)

频繁的分配和重分配造成的速度减慢。这是使用脚本语言时非常普遍的现象。如字符串被反复分配,随重分配增长和释放。不要这样做,如果可能,尽量分配大字符串和使用缓冲区。另一种方法就是尽量少用连接操作。
竞争是在分配和释放操作中导致速度减慢的问题。理想情况下,希望使用没有竞争和快速分配/释放的堆。可惜,现在还没有这样的通用堆,也许将来会有。

在所有的服务器系统中(如 IIS、MSProxy、DatabaseStacks、网络服务器、 Exchange 和其他), 堆锁定实在是个大瓶颈。处理器数越多,竞争就越会恶化。

尽量减少堆的使用
现在您明白使用堆时存在的问题了,难道您不想拥有能解决这些问题的超级魔棒吗?我可希望有。但没有魔法能使堆运行加快—因此不要期望在产品出货之前的最后一星期能够大为改观。如果提前规划堆策略,情况将会大大好转。调整使用堆的方法,减少对堆的操作是提高性能的良方。

如何减少使用堆操作?通过利用数据结构内的位置可减少堆操作的次数。请考虑下列实例:

struct ObjectA {
   // objectA 的数据
}

struct ObjectB {
   // objectB 的数据
}

// 同时使用 objectA 和 objectB

//
// 使用指针
//
struct ObjectB {
   struct ObjectA * pObjA;
   // objectB 的数据
}

//
// 使用嵌入
//
struct ObjectB {
   struct ObjectA pObjA;
   // objectB 的数据
}

//
// 集合 – 在另一对象内使用 objectA 和 objectB
//

struct ObjectX {
   struct ObjectA  objA;
   struct ObjectB  objB;
}

避免使用指针关联两个数据结构。如果使用指针关联两个数据结构,前面实例中的对象 A 和 B 将被分别分配和释放。这会增加额外开销—我们要避免这种做法。

把带指针的子对象嵌入父对象。当对象中有指针时,则意味着对象中有动态元素(百分之八十)和没有引用的新位置。嵌入增加了位置从而减少了进一步分配/释放的需求。这将提高应用程序的性能。

合并小对象形成大对象(聚合)。聚合减少分配和释放的块的数量。如果有几个开发者,各自开发设计的不同部分,则最终会有许多小对象需要合并。集成的挑战就是要找到正确的聚合边界。

内联缓冲区能够满足百分之八十的需要(aka 80-20 规则)。个别情况下,需要内存缓冲区来保存字符串/二进制数据,但事先不知道总字节数。估计并内联一个大小能满足百分之八十需要的缓冲区。对剩余的百分之二十,可以分配一个新的缓冲区和指向这个缓冲区的指针。这样,就减少分配和释放调用并增加数据的位置空间,从根本上提高代码的性能。

在块中分配对象(块化)。块化是以组的方式一次分配多个对象的方法。如果对列表的项连续跟踪,例如对一个 {名称,值} 对的列表,有两种选择:选择一是为每一个“名称-值”对分配一个节点;选择二是分配一个能容纳(如五个)“名称-值”对的结构。例如,一般情况下,如果存储四对,就可减少节点的数量,如果需要额外的空间数量,则使用附加的链表指针。
块化是友好的处理器高速缓存,特别是对于 L1-高速缓存,因为它提供了增加的位置 —不用说对于块分配,很多数据块会在同一个虚拟页中。

正确使用 _amblksiz。C 运行时 (CRT) 有它的自定义前端分配程序,该分配程序从后端(Win32 堆)分配大小为 _amblksiz 的块。将 _amblksiz 设置为较高的值能潜在地减少对后端的调用次数。这只对广泛使用 CRT 的程序适用。
使用上述技术将获得的好处会因对象类型、大小及工作量而有所不同。但总能在性能和可升缩性方面有所收获。另一方面,代码会有点特殊,但如果经过深思熟虑,代码还是很容易管理的。

其他提高性能的技术
下面是一些提高速度的技术: 

使用 Windows NT5 堆
由于几个同事的努力和辛勤工作,1998 年初 Microsoft Windows(R) 2000 中有了几个重大改进:

改进了堆代码内的锁定。堆代码对每堆一个锁。全局锁保护堆数据结构,防止多线程式的使用。但不幸的是,在高通信量的情况下,堆仍受困于全局锁,导致高竞争和低性能。Windows 2000 中,锁内代码的临界区将竞争的可能性减到最小,从而提高了可伸缩性。

使用 “Lookaside”列表。堆数据结构对块的所有空闲项使用了大小在 8 到 1,024 字节(以 8-字节递增)的快速高速缓存。快速高速缓存最初保护在全局锁内。现在,使用 lookaside 列表来访问这些快速高速缓存空闲列表。这些列表不要求锁定,而是使用 64 位的互锁操作,因此提高了性能。

内部数据结构算法也得到改进。
这些改进避免了对分配高速缓存的需求,但不排除其他的优化。使用  Windows NT5 堆评估您的代码;它对小于 1,024 字节 (1 KB) 的块(来自前端分配程序的块)是最佳的。GlobalAlloc () 和 LocalAlloc() 建立在同一堆上,是存取每个进程堆的通用机制。如果希望获得高的局部性能,则使用 Heap(R) API 来存取每个进程堆,或为分配操作创建自己的堆。如果需要对大块操作,也可以直接使用 VirtualAlloc() / VirtualFree() 操作。

上述改进已在 Windows 2000 beta 2 和 Windows NT 4.0 SP4 中使用。改进后,堆锁的竞争率显著降低。这使所有  Win32 堆的直接用户受益。CRT 堆建立于 Win32 堆的顶部,但它使用自己的小块堆,因而不能从 Windows NT 改进中受益。(Visual C++ 版本 6.0 也有改进的堆分配程序。)

使用分配高速缓存
分配高速缓存允许高速缓存分配的块,以便将来重用。这能够减少对进程堆(或全局堆)的分配/释放调用的次数,也允许最大限度的重用曾经分配的块。另外,分配高速缓存允许收集统计信息,以便较好地理解对象在较高层次上的使用。

典型地,自定义堆分配程序在进程堆的顶部实现。自定义堆分配程序与系统堆的行为很相似。主要的差别是它在进程堆的顶部为分配的对象提供高速缓存。高速缓存设计成一套固定大小(如 32 字节、64 字节、128 字节等)。这一个很好的策略,但这种自定义堆分配程序丢失与分配和释放的对象相关的“语义信息”。 

与自定义堆分配程序相反,“分配高速缓存”作为每类分配高速缓存来实现。除能够提供自定义堆分配程序的所有好处之外,它们还能够保留大量语义信息。每个分配高速缓存处理程序与一个目标二进制对象关联。它能够使用一套参数进行初始化,这些参数表示并发级别、对象大小和保持在空闲列表中的元素的数量等。分配高速缓存处理程序对象维持自己的私有空闲实体池(不超过指定的阀值)并使用私有保护锁。合在一起,分配高速缓存和私有锁减少了与主系统堆的通信量,因而提供了增加的并发、最大限度的重用和较高的可伸缩性。

需要使用清理程序来定期检查所有分配高速缓存处理程序的活动情况并回收未用的资源。如果发现没有活动,将释放分配对象的池,从而提高性能。

可以审核每个分配/释放活动。第一级信息包括对象、分配和释放调用的总数。通过查看它们的统计信息可以得出各个对象之间的语义关系。利用以上介绍的许多技术之一,这种关系可以用来减少内存分配。

分配高速缓存也起到了调试助手的作用,帮助您跟踪没有完全清除的对象数量。通过查看动态堆栈返回踪迹和除没有清除的对象之外的签名,甚至能够找到确切的失败的调用者。

MP 堆
MP  堆是对多处理器友好的分布式分配的程序包,在 Win32 SDK(Windows NT 4.0 和更新版本)中可以得到。最初由 JVert 实现,此处堆抽象建立在 Win32 堆程序包的顶部。MP 堆创建多个 Win32 堆,并试图将分配调用分布到不同堆,以减少在所有单一锁上的竞争。

本程序包是好的步骤 —一种改进的 MP-友好的自定义堆分配程序。但是,它不提供语义信息和缺乏统计功能。通常将 MP 堆作为 SDK 库来使用。如果使用这个 SDK 创建可重用组件,您将大大受益。但是,如果在每个 DLL 中建立这个 SDK 库,将增加工作设置。

重新思考算法和数据结构
要在多处理器机器上伸缩,则算法、实现、数据结构和硬件必须动态伸缩。请看最经常分配和释放的数据结构。试问,“我能用不同的数据结构完成此工作吗?”例如,如果在应用程序初始化时加载了只读项的列表,这个列表不必是线性链接的列表。如果是动态分配的数组就非常好。动态分配的数组将减少内存中的堆块和碎片,从而增强性能。

减少需要的小对象的数量减少堆分配程序的负载。例如,我们在服务器的关键处理路径上使用五个不同的对象,每个对象单独分配和释放。一起高速缓存这些对象,把堆调用从五个减少到一个,显著减少了堆的负载,特别当每秒钟处理 1,000 个以上的请求时。

如果大量使用“Automation”结构,请考虑从主线代码中删除“Automation BSTR”,或至少避免重复的 BSTR 操作。(BSTR 连接导致过多的重分配和分配/释放操作。)

摘要
对所有平台往往都存在堆实现,因此有巨大的开销。每个单独代码都有特定的要求,但设计能采用本文讨论的基本理论来减少堆之间的相互作用。 

评价您的代码中堆的使用。

改进您的代码,以使用较少的堆调用:分析关键路径和固定数据结构。

在实现自定义的包装程序之前使用量化堆调用成本的方法。

如果对性能不满意,请要求 OS 组改进堆。更多这类请求意味着对改进堆的更多关注。

要求 C 运行时组针对 OS 所提供的堆制作小巧的分配包装程序。随着 OS 堆的改进,C 运行时堆调用的成本将减小。

操作系统(Windows NT 家族)正在不断改进堆。请随时关注和利用这些改进。
Murali Krishnan  是 Internet Information Server (IIS) 组的首席软件设计工程师。从 1.0 版本开始他就设计 IIS,并成功发行了 1.0 版本到 4.0 版本。Murali 组织并领导 IIS 性能组三年 (1995-1998), 从一开始就影响 IIS 性能。他拥有威斯康星州 Madison 大学的 M.S.和印度 Anna 大学的 B.S.。工作之外,他喜欢阅读、打排球和家庭烹饪。
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=172835
我在学习对象的生存方式的时候见到一种是在堆栈(stack)之中,如下 
CObject  object; 
还有一种是在堆(heap)中  如下 
CObject*  pobject=new  CObject(); 
请问 
(1)这两种方式有什么区别? 
(2)堆栈与堆有什么区别?? 
--------------------------------------------------------------- 
1)  about  stack,  system  will  allocate  memory  to  the  instance  of  object  automatically,  and  to  the
heap,  you  must  allocate  memory  to  the  instance  of  object  with  new  or  malloc  manually. 
2)  when  function  ends,  system  will  automatically  free  the  memory  area  of  stack,  but  to  the 
heap,  you  must  free  the  memory  area  manually  with  free  or  delete,  else  it  will  result  in  memory
leak. 
3)栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 
4)堆上分配的内存可以有我们自己决定,使用非常灵活。

[zz]ARM流水线关键技术分析与代码优化

引 言

流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。
ARM7的三级流水线在执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作以及相关器件之间的数据传输。执行单元的工作往往占用多个时钟周期,从而成为系统性能的瓶颈。ARM9采用了更为高效的五级流水线设计,增加了2个功能部件分别访问存储器并写回结果,且将读寄存器的操作转移到译码部件上,使流水线各部件在功能上更平衡;同时其哈佛架构避免了数据访问和取指的总线冲突。
然而不论是三级流水线还是五级流水线,当出现多周期指令、跳转分支指令和中断发生的时候,流水线都会发生阻塞,而且相邻指令之间也可能因为寄存器冲突导致流水线阻塞,降低流水线的效率。本文在对流水线原理及运行情况详细分析的基础上,研究通过调整指令执行序列来提高流水线运行性能的方法。

1 ARM7/ARM9流水线技术
1.1 ARM7流水线技术

ARM7系列处理器中每条指令分取指、译码、执行三个阶段,分别在不同的功能部件上依次独立完成。取指部件完成从存储器装载一条指令,通过译码部件产生下一周期数据路径需要的控制信号,完成寄存器的解码,再送到执行单元完成寄存器的读取、ALU运算及运算结果的写回,需要访问存储器的指令完成存储器的访问。流水线上虽然一条指令仍需3个时钟周期来完成,但通过多个部件并行,使得处理器的吞吐率约为每个周期一条指令,提高了流式指令的处理速度,从而可达到 O.9 MIPS/MHz的指令执行速度。
在三级流水线下,通过R15访问PC(程序计数器)时会出现取指位置和执行位置不同的现象。这须结合流水线的执行情况考虑,取指部件根据PC取指,取指完成后PC+4送到PC,并把取到的指令传递给译码部件,然后取指部件根据新的PC取指。因为每条指令4字节,故PC值等于当前程序执行位置+8。
1.2 ARM9流水线技术
ARM9系列处理器的流水线分为取指、译码、执行、访存、回写。取指部件完成从指令存储器取指;译码部件读取寄存器操作数,与三级流水线中不占有数据路径区别很大;执行部件产生ALU运算结果或产生存储器地址(对于存储器访问指令来讲);访存部件访问数据存储器;回写部件完成执行结果写回寄存器。把三级流水线中的执行单元进一步细化,减少了在每个时钟周期内必须完成的工作量,进而允许使用较高的时钟频率,且具有分开的指令和数据存储器,减少了冲突的发生,每条指令的平均周期数明显减少。

2 三级流水线运行情况分析
三级流水线在处理简单的寄存器操作指令时,吞吐率为平均每个时钟周期一条指令;但是在存在存储器访问指令、跳转指令的情况下会出现流水线阻断情况,导致流水线的性能下降。图1给出了流水线的最佳运行情况,图中的MOV、ADD、SUB指令为单周期指令。从T1开始,用3个时钟周期执行了3条指令,指令平均周期数(CPI)等于1个时钟周期。

流水线中阻断现象也十分普遍,下面就各种阻断情况下的流水线性能进行详细分析。
2.1 带有存储器访问指令的流水线
对存储器的访问指令LDR就是非单周期指令,如图2所示。这类指令在执行阶段,首先要进行存储器的地址计算,占用控制信号线,而译码的过程同样需要占用控制信号线,所以下一条指令(第一个SUB)的译码被阻断,并且由于LDR访问存储器和回写寄存器的过程中需要继续占用执行单元,所以下一条(第一个 SUB)的执行也被阻断。由于采用冯·诺伊曼体系结构,不能够同时访问数据存储器和指令存储器,当LDR处于访存周期的过程中时,MOV指令的取指被阻断。因此处理器用8个时钟周期执行了6条指令,指令平均周期数(CPI)=1.3个时钟周期。

2.2 带有分支指令的流水线
当指令序列中含有具有分支功能的指令(如BL等)时,流水线也会被阻断,如图3所示。分支指令在执行时,其后第1条指令被译码,其后第2条指令进行取指,但是这两步操作的指令并不被执行。因为分支指令执行完毕后,程序应该转到跳转的目标地址处执行,因此在流水线上需要丢弃这两条指令,同时程序计数器就会转移到新的位置接着进行取指、译码和执行。此外还有一些特殊的转移指令需要在跳转完成的同时进行写链接寄存器、程序计数寄存器,如BL执行过程中包括两个附加操作——写链接寄存器和调整程序指针。这两个操作仍然占用执行单元,这时处于译码和取指的流水线被阻断了。
2.3 中断流水线
处理器中断的发生具有不确定性,与当前所执行的指令没有任何关系。在中断发生时,处理器总是会执行完当前正被执行的指令,然后去响应中断。如图4所示,在 Ox90000处的指令ADD执行期间IRQ中断发生,这时要等待ADD指令执行完毕,IRQ才获得执行单元,处理器开始处理IRQ中断,保存程序返回地址并调整程序指针指向Oxl8内存单元。在Oxl8处有IRO中断向量(也就是跳向IRQ中断服务的指令),接下来执行跳转指令转向中断服务程序,流水线又被阻断,执行0x18处指令的过程同带有分支指令的流水线。

3 五级流水线技术
五级流水线技术在多种RISC处理器中被广泛使用,被认为是经典的处理器设计方式。五级流水线中的存储器访问部件(访存)和寄存器回写部件,解决了三级流水线中存储器访问指令在指令执行阶段的延迟问题。图5为五级流水线的运行情况(五级流水线也存在阻断)。


3.1 五级流水线互锁分析
五级流水线只存在一种互锁,即寄存器冲突。读寄存器是在译码阶段,写寄存器是在回写阶段。如果当前指令(A)的目的操作数寄存器和下一条指令(B)的源操作数寄存器一致,B指令就需要等A回写之后才能译码。这就是五级流水线中的寄存器冲突。如图6所示,LDR指令写R9是在回写阶段,而MOV中需要用到的 R9正是LDR在回写阶段将会重新写入的寄存器值,MOV译码需要等待,直到LDR指令的寄存器回写操作完成。(注:现在处理器设计中,可以通过寄存器旁路技术对流水线进行优化,解决流水线的寄存器冲突问题。)


虽然流水线互锁会增加代码执行时间,但是为初期的设计者提供了巨大的方便,可以不必考虑使用的寄存器会不会造成冲突;而且编译器以及汇编程序员可以通过重新设计代码的顺序或者其他方法来减少互锁的数量。另外分支指令和中断的发生仍然会阻断五级流水线。
3.2 五级流水线优化
采用重新设计代码顺序在很多情况下可以很好地减少流水线的阻塞,使流水线的运行流畅。下面详细分析代码优化对流水线的优化和效率的提高。
要实现把内存地址0x1000和Ox2000处的数据分别拷贝到0x8000和0x9000处。
Oxl000处的内容:1,2,3,4,5,6,7,8,9,10
Ox2000处的内容:H,e,l,l,o,W,o,r,l,d
实现第一个拷贝过程的程序代码及指令的执行时空图如图7所示。

全部拷贝过程由两个结构相同的循环各自独立完成,分别实现两块数据的拷贝,并且两个拷贝过程极为类似,分析其中一个即可。
T1~T3是3个单独的时钟周期;T4~T11是一个循环,在时空图中描述了第一次循环的执行情况。在T12的时候写LR的同时,开始对循环的第一条语句进行取指,所以总的流水线周期数为3+10×10+2×9=121。整个拷贝过程需要121×2+2=244个时钟周期完成。
考虑到通过减少流水线的冲突可以提高流水线的执行效率,而流水线的冲突主要来自寄存器冲突和分支指令,因此对代码作如下两方面调整:
①将两个循环合并成一个循环能够充分减少循环跳转的次数,减少跳转带来的流水线停滞;
②调整代码的顺序,将带有与临近指令不相关的寄存器插到带有相关寄存器的指令之间,能够充分地避免寄存器冲突导致的流水线阻塞。
对代码调整和流水线的时空图如图8所示。

调整之后,T1~T5是5个单独的时钟周期,T6~T13是一个循环,同样在T14的时候BNE指令在写LR的同时,循环的第一条指令开始取指,所以总的指令周期数为5+10×10+2×9+2=125。
通过两段代码的比较可看出:调整之前整个拷贝过程总共使用了244个时钟周期,调整了循环内指令的顺序后,总共使用了125个时钟周期就完成了同样的工作,时钟周期减少了119个,缩短了119/244=48.8%,效率提升十分明显。
代码优化前后执行周期数对比的情况如表1所列。

因此流水线的优化问题主要应从两方面考虑:
①通过合并循环等方式减少分支指令的个数,从而减少流水线的浪费;
②通过交换指令的顺序,避免寄存器冲突造成的流水线停滞。

4 结 论
流水线技术提高了处理器的并行性,与串行CPU相比大大提高了处理器性能。通过调节指令序列的方法又能够有效地避免流水线冲突的发生,从而提高了流水线的执行效率。因此如何采用智能算法进行指令序列的自动调节以提高流水线的效率和进一步提高处理器的并行性将是以后研究的主要方向。

October 13

明天的午餐

     公司食堂的饭菜太难吃了,一直就想自己做午餐带到公司去吃。今天好不容易做了一次,有图为证。lunch1

lunch2

October 12

汽车标志

奥迪AUDI:
奥迪轿车的标志为四个圆环,代表着合并前的四家公司。这些公司曾经是自行车、摩托车及小客车的生产厂家。由于该公司原是由4家公司合并而成,因此每一环都是其中一个公司的象征。
奔驰BENZ:
1909年6月申请戴姆勒公司登记了三叉星做为轿车的标志,象征着陆上、水上和空中的机械化.1916年在它的四周加上了一个圆圈,在圆的上方镶嵌了4个小星,下面有梅赛德斯“Mercedes”字样。“梅赛德斯”是幸福的意思,意为戴姆勒生产的汽车将为车主们带来幸福。
大众VOLKSWAGEN:
大众汽车公司的德文Volks Wagenwerk,意为大众使用的汽车,标志中的VW为全称中头一个字母。标志象是由三个用中指和食指作出的“V”组成,表示大众公司及其产品必胜-必胜-必胜。
丰田TOYOTA:
丰田公司的三个椭圆的标志是从1990年初开始使用的。标志中的大椭圆代表地球,中间由两个椭圆垂直组合成一个T字,代表丰田公司。它象征丰田公司立足于未来,对未来的信心和雄心,还象征着丰田公司立足于顾客,对顾客的保证,象征着用户的心和汽车厂家的心是连在一起的,具有相互信赖感,同时喻示着丰田的高超技术和革新潜力。
福特FORD:
福特汽车的标志是采用福特英文Ford字样,蓝底白字。由于创建人亨利·福特喜欢小动物,所以标志设计者把福特的英文画成一只小白兔样子的图案。
宝马BMW:
宝马标志中间的蓝白相间图案,代表蓝天,白云和旋转不停的螺旋浆,喻示宝马公司渊源悠久的历史,象征该公司过去在航空发动机技术方面的领先地位,又象征公司一贯宗旨和目标:在广阔的时空中,以先进的精湛技术、最新的观念,满足顾客的最大愿望,反映了公司蓬勃向上的气势和日新月异的新面貌。
劳斯莱斯ROLLS-ROYCE:
劳尔斯·罗劳易斯汽车的标志图案采用两个“R”重叠在一起,是两们他始人亨利·莱斯和查理·史蒂华特·劳斯名字的第一个字母。象征着你中有我,我中有你,体现了两人融洽及和谐的关系。劳尔斯·劳易斯的标志除了双R之外,还有著名的飞人标志。这个标志的创意取自巴黎卢浮宫艺术品走廊的一尊有两千年历史的胜利女神雕像,她庄重高贵的身姿是艺术家们产生激情的源泉。当汽车艺术品大师查尔斯·塞克斯应邀为罗尔斯·罗易斯汽车公司设计标志时,深深印在他脑海中的女神像立刻使他产生创作灵感。于是一个两臂后伸,身带披纱的女神像飘然而至。
法拉利FERRARI:
法拉利车的标志是一匹跃起的马,在第一次世界大战中意大利有一位表现非常出色的飞行员;他的飞机上就有这样一匹会给他带来好运气的跃马。在法拉利最初的赛车比赛获胜后。该飞行员的父母亲---一对伯爵夫妇建议:法拉利也应在车上印上这匹带来好运气的跃马。后来这位飞行员战死了,马就变成了黑颜色;而标志底色为公司所在地摩德纳的金丝雀的颜色。
标致PEUGEOT:
标致汽车公司的前身,是19世纪初标致家族皮埃尔兄弟开办的一家生产拉锯、弹簧等铁制工具的小作坊。这些铁制品的商标是一个威武的雄狮,它是公司所在地弗南修·昆蒂省的标志,有不可征服的喻意。体现了标致拉锯的三大优点:锯齿象雄狮的牙齿久经耐磨、锯身象狮子的脊梁骨富有弹性、拉锯的性能象狮子一样所向无阻。当1890年,第一辆标致汽车问世时,为表明它的高品质,公司决定仍沿用“雄狮”商标。
阿斯顿·马丁ASTONMARTIN:
阿斯顿·马丁汽车标志为一只展翅飞翔的大鹏,分别注有奥斯顿、马丁英文字样。喻示该公司象大鹏一样,具有从天而降的冲刺速度和远大的志向。
本特利(宾利)(Bentley):
尔特·欧文·本特利1919年生产第一辆四汽缸赛车时车上就带有一个徽章,上面是一对隼鹰翅膀簇拥着本特利的开头字母“B”。现在四汽缸汽车已不再生产,而 “B”字徽章仍是本特利(宾利)的象征。本特利轿车标志是以公司名的第一个字母“B”为主体,生出一对翅膀,似凌空翱翔的雄鹰,此标志一直沿用至今。
林肯LINCOLN:
林肯(LINCOLN)汽车是福特汽车公司拥有的第二个品牌。镶嵌在车头正中长形围绕的十字星,象征着尊严和庄重。林肯汽车公司是亨利.利兰先生于1907 年创立的,1922年被福特汽车公司收购。初期以生产飞机发动机为业。林肯汽车是第一个以总统的名字命名的品牌,专为总统和国家元首生产的高档轿车。由于林肯车杰出的性能、高雅的造型和无与伦比的舒适,自1939年美国的富兰克林.罗斯福总统以来,一直被白宫选为总统专车。
美洲虎JAGUAR:

美洲虎汽车的名字起源,则可追溯到一九三七年。该年六月SS汽车公司正式接收了Sunbeam(Wolverhampton)汽车公司。当时,里昂斯爵士十分希望能把汽车名为Sunbeam,因为Sunbeam曾于多次的世界赛车中取得冠军,可谓“胜利”的标志。可惜,公司内部出现了一些问题。最后,被迫放弃使用Sunbeam作为公司的名字。里昂斯爵士最后拣选了一个在各种语言中都发音清脆的名字—Jaguar,它是根据第一次世界大战的一种飞行机器而命名。美洲虎又称捷豹,香港人还称“积架”,缘由英文JAGUAR的音译,它的汽车标识被设计成一只纵身跳跃的美洲虎,造型生动、形象简练、动感强烈,蕴含着力量、节奏与勇猛。
雪佛兰CHEVROLET:
雪佛兰商标表示了图案化了的蝴蝶结,Chevrolet是瑞士的赛车手、工程师路易斯·雪佛兰的名字。
雷克萨斯LEXUS:
雷克萨斯的标志取车名的英文第一个字母,即LEXUS的第一个字母“L”。
兰博基尼LAMBORGHINI:
公司的标志是一头浑身充满了力气,正准备向对手发动猛烈的攻击。据说兰伯基尼本人就是这种不甘示弱的牛脾气,也体现了兰伯基尼公司产品的特点,因为公司生产的汽车都是大功率、高速的运动型轿车。车头和车尾上的商标省去了公司名,只剩下一头犟牛。
凯迪拉克CADILLAC:
选用“凯迪拉克”之名是为了向法国的皇家贵族、探险家、美国底特律城的创始人安东尼·门斯·凯迪拉克表示敬意,商标图形主要由冠和盾组成。冠象征着凯迪拉克家族的纹章,冠上7颗珍珠喻示皇家的贵族血统。盾象征着凯迪拉克军队的英勇善战。盾分为4个等分。第一和第四等分是门斯家族的全底纹章,中间横穿过的深褐色棒把三只相同的黑鸟分开,两只在上,一只在下。这三只鸟意味三味一体的神圣,还意味着大胆和热情的基督教武士智慧、富有、聪敏的头脑和它完美的品德。第二和第三等分是由于内部通婚,当另一块领土加到门斯家族的财产上时,这些4等分才能在门斯盾形纹章里被采用。4等分内采用的色彩表明了广阔的土地,增色了门斯家族的名望,红色标志着行动的勇敢和大胆;银色表示团结、博爱、美德和富有。横穿的棒表示了在十字军战争的骑士们的勇敢。凯迪拉克商标是底特律城创始人的祖先的英勇和荣誉。
阿尔法-罗蜜欧ALFAROMEO:
阿尔法.罗米欧的标志于30年代初就开始使用,这是米兰市的市徽,也是中世纪米兰的领主维斯康泰公爵的家徽,标志中的十字部分来源于十字军从米兰向外远征的故事;右边部分是米兰大公的徽章;关于蛇正在吞食撒拉迅人的图案有种种传说,其中之一的说法是象征着维斯康泰的祖先曾经击退了使人民遭受苦难的“龙”。总之,这枚古老的徽章伴同阿尔法.罗米欧运动车已名扬四海,成为当今的知名商标之一。
沃尔沃
“沃尔沃”(VOLVO),也译为“富豪”。车标由图标和文字商标两部分组成。沃尔沃图形车标是由双圆环组成车轮的形状,并有指向右上方的箭头。中间的拉丁语文字“VOLVO”,是滚滚向前的意思,寓意着沃尔沃汽车的车轮滚滚向前和公司兴旺发达、前途无量。
马自达
马自达汽车公司的原名为东洋工业公司,生产的汽车用公司创始人“松田”来命名,又因“松田”的拼音为MAZDA(马自达),所以人们便习惯称为马自达。
马自达起初使用的车标,是在椭圆之中有双手捧着一个太阳,寓意马自达公司将拥有明天,马自达汽车跑遍全球。
马自达公司与福特公司合作之后,采用了新的车标,椭圆中展翅飞翔的海鸥,同时又组成“M”字样。“M”是“MAZDA”第一个大写字母,预示该公司将展翅高飞,以无穷的创意和真诚的服务,迈向新世纪。
旁蒂克
旁蒂克(PONTIAC)车标,由字母和图形两部分组成。字母“PONTIAC”,取自美国密执安州的一个地名:图形车标是带十字标记的箭头。而十字形标记,则表示旁蒂克是通用汽车公司的重要成员,也象征旁蒂克汽车安全可*;箭头则代表旁蒂克的技术超前和攻关精神,预示着旁蒂克汽车跑遍全球。
莲花
莲花车标,是在椭圆形底板上镶嵌着抽象了的莲花造型,上面除了有“莲花”(LOTUS)字样外,还以创始人查普曼姓名全称(A.C.B.CHAPMAN)的四个英文字母“A.C.B.C”叠加在一起而成。
莲花公司是英国人查普曼1951年创立的,主要生产跑车,由于规模小,在激烈的竞争中几经易手,现落户到意大利的菲亚特汽车公司。
雷诺
1898年,路易斯.雷诺三兄弟在法国比仰古创建雷诺汽车公司。它是世界上最悠久的汽车公司之一。主要产品有雷诺牌轿车、公务用车和运动车等。
雷诺车标是四个菱形拼成的图案,象征雷诺三兄弟与汽车工业融为一体,表示“雷诺”能在无限的(四维)空间中竞争、生存、发展。
通用别克
别克(BUICK)商标中形似“三利剑”的图案为共图形商标,被安装在汽车散热器格栅上。那三把颜色不同的利剑(从左到右分别为红、白、蓝三种颜色),依次排列在不同的高度位置上,给人一种积极进取、不断攀登的感觉,它表示别克采用顶级技术,别克人是勇于登峰的勇士。
别克(BUICK)轿车的英文车标来源于该公司的创始人大卫.别克的姓氏。而整个商标是一只展翅的雄鹰即将落在别克的英文字母上。它象征着别克是雄鹰最理想的栖息之地,正应了中国的那句谚语:“家有梧桐树,才能招来金凤凰。”
保时捷
保时捷的英文车标采用德国保时捷公司创始人费迪南德.保时捷的姓氏。图形车标采用公司所在地斯图加特市的盾形市徽。“PORSCHE”字样在商标的最上方,表明该商标为保时捷设计公司所拥有;商标中的“STUTTCART”字样在马的上方,说明公司总部在斯图加特市;商标中间是一匹骏马,表示斯图加特这个地方盛产一种名贵种马;商标的左上方和右下方是鹿角的图案,表示斯图加特曾是狩猎的好地方;商标右上方和左下方的黄色条纹代表成熟了的麦子颜色,喻指五谷丰登,商标中的黑色代表肥沃土地,商标中的红色象征人们的智慧和对大自然的钟爱,由此组成一幅精湛意深、秀气美丽的田园风景画,展现了保时捷公司辉煌的过去,并预示了保时捷公司美好的未来,保时捷跑车的出类拔萃!
欧宝
凡是经常看电视体育频道节目的观众,都会在大型国际球类比赛中看到“圆圈闪电”的徽记,那就是德国欧宝汽车的标识。“圆圈闪电”,即意味着欧宝汽车的力量和速度是无与伦比的;欧宝公司永远充满着生机与活力。
德国欧宝公司是美国通用汽车公司的子公司,是通用公司在欧洲的一个窗口。它由亚当.欧宝所创立,至今已有百多年历史。由于欧宝公司对足球世界杯、欧锦赛、戴维斯杯、联盟杯网球赛等世界重大球类比赛的赞助,使得欧宝公司在体育领域有很高的声望,无疑也给其带来丰厚的回报。目前,欧宝的产品已遍及世界20多个国家的100多个市场。欧宝轿车已连续5年保持了西欧轿车头号品牌的位置,占据了西欧轿车市场12%的份额。
菲亚特
意大利菲亚特公司创建于1899年7月,至今已有百余年历史。现在菲亚特是意大利最为重要的汽车制造中心及最大的私有企业集团。该集团建立初期只生产轿车,然后产品很快多样化,领域涉及商用车辆、船舶、飞机、火车、农用拖拉机及建筑机械等。如今菲亚特已成为世界上最大的工业集团之一。该集团有218个生产厂和138个研究开发中心,在世界上59个国家拥有850多个公司,拥有237000名雇员,其利税已超过510亿美元。
菲亚特(FIAT)意大利都灵汽车制造厂(Fabbrica Itliana Auto-mobi Ledi Torino)的译文缩写“fiat”在英语中的词意为“法会”、“许可”、“批准”。该公司的标识一直沿用“FIAT”,只是形状和色彩有不同的改进。如1921年为红字白底圆形标识;1931年使用了字体纵向拉工的商标;1959年因公司推出了新款车而把车标做大,边角做圆;1965年把桂枝缠绕的红底白字圆形标识作为正式标志;1968年成立股份公司出现了四个方块中各有一个字母的新标识;1991年出厂的菲亚特600型则改用前脸是5条斜拉直杠,后部仍为四方块的标识。
罗孚
Rover Mascot(吉祥物)源自世界上最著名的流浪族——维京人的双关语。而“Rover”这个词,英语中包含流浪者、航海者的意思。
从1902年起,这个标志便放在了一辆辆汽车前正中的位置上。
20世纪20年代,戴头盔的维京人形象和三角形徽章吸引了一代喜爱Rover车的年轻人。
后来,Rover标志中站立的维京人逐渐让位于他的头像,不过他仍然带着头盔。准确而符合逻辑地说,是让位于维京人大海船的船头雕像。
维京人海船的船首和帆于1929年首次出现在散热器的标志牌上,它作为吉祥象征贯串于Rover 车的百年历史。
1947 郑周永创建现代汽车公司,经50多年的发展,它已成为韩国最大的汽车生产厂家,并进入世界著名汽车大公司行列。其商标是在椭圆中采用斜体字“H“,“H “是现代汽车公司英文名“HYUNDAI“的第一个大写字母。 “现代“首先体现了“2000年在世界上腾飞的现代汽车公司“这一概念;其次还象征现代汽车公司在和谐与稳定中发展。商标中的椭圆即代表汽车的方向盘,又可以看作是地球,与其间的H结合在一起恰好代表了现代汽车遍布全世界的意思。
斯柯达
“斯柯达“商标的含义是:巨大的圆环象征着斯柯达为全世界无可挑剔的产品;鸟翼象征着技术进步的产品行销全世界;向右飞行着的箭头,则象征着先进的工艺;外环中朱黑的颜色象征着斯柯达公司百余年的传统;中央铺着的绿色,则表达了斯柯达人对资源再生和环境保护的重视。 现在生产的斯柯达 .弗雷西亚牌汽车的商标最下边部分的桂枝树叶,表示胜利。另外,关于“斯柯达“商标还有一个传说:据说,该厂的经理从美洲带回一名印第安仆人,这个人很勤快,脸谱也很美,所以就选用了他的脸谱作为商标,即现在的斯柯达箭形商标。
克莱斯勒
克莱斯勒(Chrysler)公司是创始人沃尔特.克莱斯勒的姓氏命名的汽车公司。图形商标像一枚五角星勋章,它体现了克莱斯勒家族和公司员工们的远大理想和抱负,以及永远无止境的追求和在竞争中获胜的奋斗精神。五角星的五个部分,分别表示五大洲都在使用克莱斯勒汽车公司的汽车,克莱斯勒汽车公司的汽车遍及全球 。
雪铁龙
1900 年,安德烈·雪铁龙发明了人字形齿轮。1912年,安德列·雪铁龙开始用人字形齿轮作为雪铁龙公司产品的商标。后来,雪铁龙曾组织过横穿非洲大陆和横越亚洲大陆的两次旅行,使雪铁龙汽车名声大振。法国人生性开朗,爱赶时髦,喜欢新颖和漂亮,"雪铁龙"轿车就表现了法兰西这种性格,每时每刻都在散发着法国的浪漫气息。

August 31

zz 有时间再看

行业里干了很多年,发表一下自己当前的想法

一、运营商的政策情况:
移动集团在去年甚至更早以前,曾经有过对当前无线增值行业格局进行修改的规划,规划的主要内容就是移动公司将外围CP提供的内容通过数据部整合包装成具体产品后,再通过自有及外部渠道进行销售。从今年开始移动摆明落实此事。那从各省来看,最明显的信号就是对内部架构的相继调整,如数据业务的营销职能从数据部剥离划归市场部,也就是由市场部负责数据业务的销售,背集团的KPI指标。而数据部只负责产品的创新、现有合作SP的管理以及业务投诉。
基于这个思想,对于移动公司来说最成功的产品就是彩铃。彩铃最初诞生时是在各地方接入,各地移动提供平台,SP提供内容并负责销售,随后集团在四川建起了中央音乐基地,并想逐步的弱化最终取代地方平台,中央音乐平台采取的是与合作方55分成,统一营销,其实就是一种CP合作概念。彩铃在地方多年的运营可以说已经建立了一种比较稳定的利益平衡,涉及到的是移动公司、SP、其他第三方势力。集团提出中央取代地方这样的思想后,除了集团和基地大家都很不乐意,所以会有一些异议提出来,例如地方音乐需求,这个中央音乐基地是无法满足的。近几年,移动集团也多次对政策进行了微调,如修改新增业务的准入条件,要求有本地特色才可新申请接入等等,但到地方的执行标准就各不相同了。
到现在经过这几年的博弈中央统一地方的条件已经基本成熟了,于是移动集团在09年KPI规划时就非常明确的把本地彩铃划了出去,你做多少没用,不计入 KPI!应该是在3个月前在民间流传的一个来路不明的移动官方文件,要求自09年结束后,各地公司不得再与本地SP续签彩铃合同,其实这个实施起来也有很多困难,保留现在有本地平台继续提供服务,订了本地彩铃的用户可以使用到有效期结束,但问题是铃音盒用户怎么办?而且铃音盒收入在本地占彩铃收入中占主导。这都是问题。
还有另外一个概念就是移动上半年提出的基于中央音乐平台的地方铃音盒,地方有权限每月对5款音乐盒的内容进行选择,上报集团审批,而这个本地可控的铃音盒内容每个月都是变化的,我认为这个产品的是集团对无线增值业务新的格局的进一步尝试。
从短信方面看,短信仍然是无线增值业务收入的重头。上半年移动公司的主要态度对是加大了对各SP现有渠道的监管。
第一是从去年下半年开始对核减的清缴,而且手段也是逐步加深的,经过这几年的整理目前移动公司已经对核减有了比较明确的概念,并且有一个较严谨的评估方式,如号码信息费月上限以及占月总费用的比重。对于核减的追缴也由原来的1585分成后金额改为分成前加通话费。近期又加大了处罚力度,对于核减较高的代码可能会被停止并有中止合作的风险。
第二是对手机内置业务的监管,从今年2月工信部在天津对手机内置的拔测到今年6月移动集团开始实行的全国性的手机内置业务拔测,可以说对这个渠道的影响非常大。
第三就是“五条禁令”,五条禁令基本内容就是明确禁止了对客户信息泄露、puhpush、捆绑批开行为。并点明禁止了运营商与SP、平台商、渠道之间的不正常合作关系。
新联通和新电信对于增值业务的态度还不够明朗,自从去年整合后还一直处于调整期,特别北方的电信非常弱,而联通在有大量网通员工入驻后级别普遍是比原联通的高半级,而网通对增值业务的理解是没有联通深入的,联通本来研究的也不深。而南方的电信之前只有小灵通,也谈不上增值业务的经营,所以我对这两个运营商的态度是观望及接近,如果有机会呢再积极介入。
二、公司如何应对转型
基于以上思想,我们应该更多在产品和营销上下下功夫,新产品必须要强调的是实用性,或者能给用户带来便捷的服务,或者能给用户带来全新的体验,或者能给运营商当前平台功能进行补充。
A.产品创新
1.内容合作:
例如音乐内容,手机报内容,以及彩信内容新闻内容等等,其实这些我们都可以把它做成一个固定的产品。
2.开发有营销功能的虚拟营业平台。
这个平台的基本功能是实现地方移动一个虚拟营业厅的功能,用户可以通过拔打这个号码方便的实现业务办理,积分兑换等功能,相当于10086和12580平台的补充,如果这个平台能实现推广应该可以大大减轻营业厅的以及10086和12580的工作量,同时这个平台还可以做业务推广及主动外呼。
3.我思考的关于跨运营商平台服务这样一个思路。涉及的应用可能是puh,手机邮箱以或者IM即时通软件。
大家都知道当前的手机邮箱及IM软件,都是限于移动、联通、电信这样的单运营商,手机邮箱就是移动@139,电信@189,联通@156,IM可能目前成功应用的只有飞信。如果我们能提供一个跨运营商的服务,像天翼广告做的那个,上网账号,邮箱,聊天一个号码。如邮箱,就是手机号码@sina或者别的什么服务器,IM软件号就是手机号,能包容移动、联通、电信的所有用户,我想如果这个产品能成功应用那将是另一翻景象。
4.就是关于手机终端软件:
这个我觉得很重要,就目前来讲最实际的应该是做一个集成多种增值业务的一个客户端软件,如果用户不消费增值业务,也能享受到一些必须的其他免费功能服务。
B.营销创新
首先是配合运营商的KPI行动。在争取运营商每年制订的固定活动上要努力争取,当前的主要形式是歌友会。如果参与了,与运营商之间合作的基调就已经定下来了,这个虽然不一定挣钱,但是会有充分的理由和运营商走的很近,后面就看如何发挥优势了。
其次就是如何引导运营商举办其他活动,歌友会目前是太透明了,附加值比较低,很难真正赚到钱。从当前运营商活动来看面对用户群主要是动感地带客户,所以我想着手从全球通用户或者VIP用户入手,做活动换取数据业务资源,从文化上开拓一下思路,可以配合push mail。
三、现有产品如何应对
如何应对运营商当前不利政策,也就是如何保证公司即能赢利,又能保证端口的安全。
A.核减。
产生核减必须满足以下两个条件:
1.增值产品赠送虚拟货币
2.运营商计费漏洞或打折卡
核减很久以前就有了,最早是SP恶意套取运营商费用用打折卡刷自己的业务,赚取差价,后来由于治理太严,基本消失了。
之后就是由于一些SP在增值产品中附赠虚拟货币。从联通开始发展到移动。简言之就是恶意用户利用运营商计费漏洞盗取产品中赠送的虚拟货币,再进行二次销售获利。起初在运营商被定义为自消费,之后慢慢理解后才只核减的。对这事的处罚也从开始以停端口到前期的返还核减费用。但是由于上半年运营商政策的变化,数据部不背营收指标而背投诉等其他考核指标,所以他们在监管上就逐渐严格了,有的省公司就直接说:你们不能控制量给我制造麻烦,我就只能停止你们的代码。所以要想这个渠道继续发挥就必须对产品逻辑进行修改,例如按手机号消费额及日号段消费额度的限制,或者建立一个用户信用数据库,没有在数据库中的用户属于新用户,新用户首次使用业务有日消费费用限制(如最高5元或10 元),新用户在48或72小时后自动转为信用用户,他的操作不再受日消费金额的限制,或者有必要再设计更复杂的信用流程,分阶段定信用,超过一个月的用户为最高信用等级,相信那些恶意用户不会把他们的手机号使用超过一个月。
B.内置
当前移动在对内置为期半年的拔测,至于最终的拔测态度还没有定,所以大家在做好资费提示的基础上,就是默默等待政策了。
C.媒体投放
目前看来媒体投放给安全带来的问题并不大,这和电购行业差不多,电购近些年不好做,原因一是用户越来越理智,二是新产品太少。其实电视购物这个行业就是不停的推出新产品来刺激用户冲动消费。那对于我们来说,就是针对有限的产品推出无限的新玩法让用户参与其中。
四、3G到来
多年前,SP行业就一直说进入寒冬,到现在也没人说走向春天。其实我认为前些年就是变态。现在也不正常。一直在等3G到来,3G能带来什么?先说眼前的游戏吧
我个人觉得单机收费游戏有可能是一个过度产品,最终可能会被免费游戏取代,专业游戏公司的商业模式也会变化。当前阶段运营商对手机游戏的发展某种方面起到了阻碍作用,G+游戏包及独立包其实就是手机游戏的一个销售渠道,有没有百宝箱,有没有G+游戏包,没有独立包,手机游戏都是存在的。游戏是可以放到网站上,也可以摆到柜台上去销售的,我相信随着智能手机的增加,手游行业会迎来蓬勃发展的机会。
从营销模式上来看,我觉得也是有问题的,那就是向用户推广一个陌生的渠道,陌生的渠道中包含一个陌生的并且收费的产品,用这个陌生的产品来增加手机的娱乐功能,当然这个娱乐功能对用户也是陌生的。这里面最阻碍行业发展的两个关键就是收费和陌生!但当前手游的发展阶段是必须要收费的,所以我想我们应该去解决的如何让用户不陌生,两方面,广告和产品。广告我们不要去考虑了,不知道为谁做嫁衣呢。从产品和渠道上可以下下功夫。那最直接想到的就是当前的网游用户,如魔兽。我们是否与这些游戏公司合作,开发出一个手机客户端产品,其中包含一些简单功能,如道具买卖、打怪升级这些完全没有必要盯着电脑去完成的事,除此之外也可以增加一些娱乐性,如制订手机终端任务以获取特殊物品及经验。其实这里面腾讯就是一个很好的例子。如果从渠道考虑呢,只盯着移动实在是太局限,像诺基亚就是一个很大的渠道,如果从根本出发,我们应该在利用自己的资源,对自有渠道的建立上多下下功夫。渠道是载体,记得一个做教育产品的公司,哪家想不起来了,推出什么产品什么产品卖的好,代理别人的产品也一样,靠的就是渠道。
说回来现在的游戏包,怎么越看越像音乐盒!

August 29

杭州景点门票价格一览表

杭州景点门票价格一览表

景点名称

地址

票价(元)

公园IC卡

六种对象

中国茶叶博物馆

龙井路双峰

免票

通用

免票

章太炎纪念馆

南山路苏堤口

免票

通用

免票

太子湾公园

南山路苏堤口

免票

通用

免票

苏东坡纪念馆

南山路苏堤口

免票

通用

免票

曲院风荷

西山路17号

免票

通用

免票

南宋官窑博物馆

施家山42号

免票

通用

免票

法净寺

灵隐寺旁

免票

通用

免票

凤凰寺

中山中路227号

免费

通用

免票

天主堂

中山北路415号

免费

通用

免票

思澄堂

解放路132号

免费

通用

免票

九溪瀑布

九溪十八涧

免票

通用

免票

花港观鱼

西山路5-1号

免票

通用

免票

杭州历史博物馆

粮道山18号

免票

通用

免票

杭州花圃

西山路14号

免票

通用

免票

杭州碑林

劳动路65号

2

通用

免票

孔雀园

桃源岭1号

4

通用

免票

云栖竹径

云栖路8号

8

通用

免票

满陇桂雨(少儿公园)

虎跑路15号

10

通用

免票

郭庄

西山路13号

10

通用

免票

玉皇山

玉皇山路1号

10

通用

免票

杭州植物园

桃源岭1号

10

通用

免票

万松书院

万松岭

10

通用

免票

杭州动物园

虎跑路40号

15

通用

免票

虎跑公园

虎跑路39号

15

通用

免票

钱王祠

南山路南线风景区

15

通用

免票

六和塔公园

之江路16号

20

通用

免票

岳王庙

北山路80号

25

通用

免票

灵隐飞来峰

灵隐路34号

35

通用

免票

黄龙洞

曙光路16号

15

补差4元

免票

胡雪岩故居

元宝街18号

20

补差5元

半票

西溪湿地

80

补差10元

吴山城隍阁

吴山城隍阁景区

30

补差10元

半票

三潭印月(湖中三岛)

西湖湖中心

45

不通用

免票

云松书舍

灵隐路双峰插云

5

不通用

免票

龙井山园

翁家山104号

35

不通用

半票

老龙井御茶园

狮峰山麓

10

不通用

六和塔登塔

之江路16号

10

不通用

不免票

抱朴道院

葛岭半山腰

5

不通用

雷峰塔

40

不通用

灵隐寺

35

寺庙卡通用

永福寺

灵隐寺旁

10

寺庙卡通用

法镜寺

10

寺庙卡通用

法喜寺

10

寺庙卡通用

净慈寺(南屏晚钟)

10

寺庙卡通用

灵顺寺

北高峰顶

5

寺庙卡通用

注:上述6种游客对象是指全国70岁以上老年人、离休干部、现役军人; 浙江省内30年教龄教师;杭州市区残疾人、优抚对象。

补充下,还有六通宾馆那里的高丽寺 票价20  ic卡补差价10元。

August 22

【整理】构造函数 拷贝构造函数 赋值函数

构造函数:

对象创建都会调用构造函数,不实现C++也会默认生成一个,其目的是实现对象的创建和对象成员变量赋初始值。其特点是:

1.构造函数的命名必须和类名完全相同;而一般函数则不能和类名相同.
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用.

拷贝构造函数:

拷贝构造函数的格式为:构造函数名(对象的引用)

有这样几种case会用到拷贝构造函数:

  1. 一个对象以值传递的方式传入函数体;
  2. 一个对象以值传递的方式从函数返回;
  3.一个对象需要通过另外一个对象进行初始化;

拷贝构造函数不可以改变它所引用的对象,其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

赋值函数:

即是赋值符的重载函数,形式为  A& A::operator = (const A& a1)

其实现上有几个注意点:

1.自检查,防止自己给自己赋值。

2.释放原有资源。

3.malloc 新的资源并复制。

4.返回本对象的引用。return *this; 以对象的链式表达(a=b=c)

August 20

[zz]7个顶级心理寓言

 

(一)成长的寓言:做一棵永远成长的苹果树

一棵苹果树,终于结果了。
第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。“哈哈,去年我得到了10%,今年得到20%!翻了一番。”这棵苹果树心理平衡了。
但是,它还可以这样:继续成长。譬如,第二年,它结了100个果子,被拿走90个,自己得到10个。
很可能,它被拿走99个,自己得到1个。但没关系,它还可以继续成长,第三年结1000个果子……
其实,得到多少果子不是最重要的。最重要的是,苹果树在成长!等苹果树长成参天大树的时候,那些曾阻碍它成长的力量都会微弱到可以忽略。真的,不要太在乎果子,成长是最重要的。

【心理点评】你是不是一个已自断经脉的打工族?
刚开始工作的时候,你才华横溢,意气风发,相信“天生我才必有用”。但现实很快敲了你几个闷棍,或许,你为单位做了大贡献没人重视;或许,只得到口头重视但却得不到实惠;或许……总之,你觉得就像那棵苹果树,结出的果子自己只享受到了很小一部分,与你的期望相差甚远。
于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。
“老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。
这样的故事,在我们身边比比皆是。
之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。
好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。
切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要。

(二)动机的寓言:孩子在为谁而玩

一群孩子在一位老人家门前嬉闹,叫声连天。几天过去,老人难以忍受。
于是,他出来给了每个孩子25美分,对他们说:“你们让这儿变得很热闹,我觉得自己年轻了不少,这点钱表示谢意。”
孩子们很高兴,第二天仍然来了,一如既往地嬉闹。老人再出来,给了每个孩子15美分。他解释说,自己没有收入,只能少给一些。15美分也还可以吧,孩子仍然兴高采烈地走了。
第三天,老人只给了每个孩子5美分。
孩子们勃然大怒,“一天才5美分,知不知道我们多辛苦!”他们向老人发誓,他们再也不会为他玩了!

【心理点评】你在为谁而“玩”
这个寓言是苹果树寓言的更深一层的答案:苹果树为什么会自断经脉,因为它不是为自己而“玩”。
人的动机分两种:内部动机和外部动机。如果按照内部动机去行动,我们就是自己的主人。如果驱使我们的是外部动机,我们就会被外部因素所左右,成为它的奴隶。
在这个寓言中,老人的算计很简单,他将孩子们的内部动机“为自己快乐而玩”变成了外部动机“为得到美分而玩”,而他操纵着美分这个外部因素,所以也操纵了孩子们的行为。寓言中的老人,像不像是你的老板、上司?而美分,像不像是你的工资、奖金等各种各样的外部奖励?
如将外部评价当作参考坐标,我们的情绪就很容易出现波动。因为,外部因素我们控制不了,它很容易偏离我们的内部期望,让我们不满,让我们牢骚满腹。不满和牢骚等负性情绪让我们痛苦,为了减少痛苦,我们就只好降低内部期望,最常见的方法就是减少工作的努力程度。
一个人之所以会形成外部评价体系,最主要的原因是父母喜欢控制他。父母太喜欢使用口头奖惩、物质奖惩等控制孩子,而不去理会孩子自己的动机。久而久之,孩子就忘记了自己的原初动机,做什么都很在乎外部的评价。上学时,他忘记了学习的原初动机———好奇心和学习的快乐;工作后,他又忘记了工作的原初动机 ———成长的快乐,上司的评价和收入的起伏成了他工作的最大快乐和痛苦的源头。
切记:外部评价系统经常是一种家族遗传,但你完全可以打破它,从现在开始培育自己的内部评价体系,让学习和工作变成“为自己而玩”。

(三)规划的寓言:把一张纸折叠51次

想象一下,你手里有一张足够大的白纸。现在,你的任务是,把它折叠51次。那么,它有多高?
一个冰箱?一层楼?或者一栋摩天大厦那么高?不是,差太多了,这个厚度超过了地球和太阳之间的距离。

【心理点评】
到现在,我拿这个寓言问过十几个人了,只有两个人说,这可能是一个想象不到的高度,而其他人想到的最高的高度也就是一栋摩天大厦那么高。
折叠51次的高度如此恐怖,但如果仅仅是将51张白纸叠在一起呢?
这个对比让不少人感到震撼。因为没有方向、缺乏规划的人生,就像是将51张白纸简单叠在一起。今天做做这个,明天做做那个,每次努力之间并没有一个联系。这样一来,哪怕每个工作都做得非常出色,它们对你的整个人生来说也不过是简单的叠加而已。
当然,人生比这个寓言更复杂一些。有些人,一生认定一个简单的方向而坚定地做下去,他们的人生最后达到了别人不可企及的高度。譬如,我一个朋友的人生方向是英语,他花了十数年努力,仅单词的记忆量就达到了十几万之多,在这一点上达到了一般人无法企及的高度。
也有些人,他们的人生方向也很明确,譬如开公司做老板,这样,他们就需要很多技能———专业技能、管理技能、沟通技能、决策技能等等。他们可能会在一开始尝试做做这个,又尝试做做那个,没有一样是特别精通的,但最后,开公司做老板的这个方向将以前的这些看似零散的努力统合到一起,这也是一种复杂的人生折叠,而不是简单的叠加。
切记:看得见的力量比看不见的力量更有用。
现在,流行从看不见的地方寻找答案,譬如潜能开发,譬如成功学,以为我们的人生要靠一些奇迹才能得救。但是,在我看来,东莞恒缘心理咨询中心的咨询师毛正强说得更正确,“通过规划利用好现有的能力远比挖掘所谓的潜能更重要。”

(四)逃避的寓言:小猫逃开影子的招数

“影子真讨厌!”小猫汤姆和托比都这样想,“我们一定要摆脱它。”
然而,无论走到哪里,汤姆和托比发现,只要一出现阳光,它们就会看到令它们抓狂的自己的影子。
不过,汤姆和托比最后终于都找到了各自的解决办法。汤姆的方法是,永远闭着眼睛。托比的办法则是,永远待在其他东西的阴影里。

【心理点评】
这个寓言说明,一个小的心理问题是如何变成更大的心理问题的。
可以说,一切心理问题都源自对事实的扭曲。什么事实呢?主要就是那些令我们痛苦的负性事件。
因为痛苦的体验,我们不愿意去面对这个负性事件。但是,一旦发生过,这样的负性事件就注定要伴随我们一生,我们能做的,最多不过是将它们压抑到潜意识中去,这就是所谓的忘记。
但是,它们在潜意识中仍然会一如既往地发挥作用。并且,哪怕我们对事实遗忘得再厉害,这些事实所伴随的痛苦仍然会袭击我们,让我们莫名其妙地伤心难过,而且无法抑制。这种疼痛让我们进一步努力去逃避。
发展到最后,通常的解决办法就是这两个:要么,我们像小猫汤姆一样,彻底扭曲自己的体验,对生命中所有重要的负性事实都视而不见;要么,我们像小猫托比一样,干脆投靠痛苦,把自己的所有事情都搞得非常糟糕,既然一切都那么糟糕,那个让自己最伤心的原初事件就不是那么疼了。
白云心理医院的咨询师李凌说,99%的吸毒者有过痛苦的遭遇。他们之所以吸毒,是为了让自己逃避这些痛苦。这就像是躲进阴影里,痛苦的事实是一个魔鬼,为了躲避这个魔鬼,干脆把自己卖给更大的魔鬼。
还有很多酗酒的成人,他们有过一个酗酒而暴虐的老爸,挨过老爸的不少折磨。为了忘记这个痛苦,他们学会了同样的方法。
除了这些看得见的错误方法外,我们人类还发明了无数种形形色色的方法去逃避痛苦,弗洛伊德将这些方式称为心理防御机制。太痛苦的时候,这些防御机制是必要的,但糟糕的是,如果心理防御机制对事实扭曲得太厉害,它会带出更多的心理问题,譬如强迫症、社交焦虑症、多重人格,甚至精神分裂症等。
真正抵达健康的方法只有一个———直面痛苦。直面痛苦的人会从痛苦中得到许多意想不到的收获,它们最终会变成当事人的生命财富。
切记:阴影和光明一样,都是人生的财富。
一个最重要的心理规律是,无论多么痛苦的事情,你都是逃不掉的。你只能去勇敢地面对它,化解它,超越它,最后和它达成和解。如果你自己暂时缺乏力量,你可以寻找帮助,寻找亲友的帮助,或寻找专业的帮助,让你信任的人陪着你一起去面对这些痛苦的事情。
美国心理学家罗杰斯曾是最孤独的人,但当他面对这个事实并化解后,他成了真正的人际关系大师;美国心理学家弗兰克有一个暴虐而酗酒的继父和一个糟糕的母亲,但当他挑战这个事实并最终从心中原谅了父母后,他成了治疗这方面问题的专家;日本心理学家森田正马曾是严重的神经症患者,但他通过挑战这个事实并最终发明出了森田疗法……他们生命中最痛苦的事实最后都变成了他们最重要的财富。你,一样也可以做到。

(五)行动的寓言———螃蟹、猫头鹰和蝙蝠

螃蟹、猫头鹰和蝙蝠去上恶习补习班。数年过后,它们都顺利毕业并获得博士学位。不过,螃蟹仍横行,猫头鹰仍白天睡觉晚上活动,蝙蝠仍倒悬。

【心理点评】
这是黄永玉大师的一个寓言故事,它的寓意很简单:行动比知识重要。
用到心理健康中,这个寓言也发人深省。
心理学的知识堪称博大精深。但是,再多再好的心理学知识也不能自动帮助一个人变得更健康。其实,我知道的一些学过多年心理学的人士,他们学心理学的目的之一就是要治自己,但学了这么多年以后,他们的问题依旧。
之所以出现这种情况,一个很重要的原因是,他们没有身体力行,那样知识就只是遥远的知识,知识并没有化成他们自己的生命体验。
我的一个喜欢心理学的朋友,曾被多名心理学人士认为不敏感,不适合学心理学。但事实证明,这种揣测并不正确。他是不够敏感,但他有一个非常大的优点:知道一个好知识,就立即在自己的生命中去执行。这样一来,那些遥远的知识就变成了真切的生命体验,他不必“懂”太多,就可以帮助自己,并帮助很多人。
如果说,高敏感度是一种天才素质,那么高行动力是更重要的天才素质。
这个寓言还可以引申出另一种含义:不要太指望神秘的心理治疗的魔力。最重要的力量永远在你自己的身上,奥秘的知识、玄妙的潜能开发、炫目的成功学等等,都远不如你自己身上已有的力量重要。我们习惯去外面寻找答案,去别人那里寻找力量,结果忘记了力量就在自己身上。
切记:别人的知识不能自动地拯救你。
如果一些连珠的妙语打动了你,如果一些文字或新信条启发了你。那么,这些别人的文字和经验都只是一个开始,更重要的是,你把你以为好的知识真正运用到你自己的生命中去。
犹太哲学家马丁·布伯的这句话,我一直认为是最重要的:
你必须自己开始。假如你自己不以积极的爱去深入生存,假如你不以自己的方式去为自己揭示生存的意义,那么对你来说,生存就将依然是没有意义的。

(六)放弃的寓言:蜜蜂与鲜花

玫瑰花枯萎了,蜜蜂仍拼命吮吸,因为它以前从这朵花上吮吸过甜蜜。但是,现在在这朵花上,蜜蜂吮吸的是毒汁。
蜜蜂知道这一点,因为毒汁苦涩,与以前的味道是天壤之别。于是,蜜蜂愤不过,它吸一口就抬起头来向整个世界抱怨,为什么味道变了?!
终于有一天,不知道是什么原因,蜜蜂振动翅膀,飞高了一点。这时,它发现,枯萎的玫瑰花周围,处处是鲜花。

【心理点评】
这是关于爱情的寓言,是一位年轻的语文老师的真实感悟。
有一段时间,她失恋了,很痛苦,一直想约我聊聊,希望我的心理学知识能给她一些帮助。我们一直约时间,但快两个月过去了,两人的时间总不能碰巧凑在一起。
最后一次约她,她说:“谢谢!不用了,我想明白了。”
原来,她刚从九寨沟回来。失恋的痛苦仍在纠缠她,让她神情恍惚,不能享受九寨沟的美丽。不经意的时候,她留意到一只小蜜蜂正在一朵鲜花上采蜜。那一刹那间,她脑子里电闪雷鸣般地出现了一句话:“枯萎的鲜花上,蜜蜂只能吮吸到毒汁。”
当然,大自然中的小蜜蜂不会这么做,只有人类才这么傻,她这句话里的蜜蜂当然指她自己。这一刹那,她顿悟出了放弃的道理。以前,她想让我帮她走出来,但翅膀其实就长在她自己身上,她想飞就能飞。
放弃并不容易,爱情中的放弃尤其令人痛苦。因为,爱情是对我们幼小时候的亲子关系的复制。幼小的孩子,无论从哪个方面看,都离不开爸爸妈妈。如果爸爸妈妈完全否定他,那对他来说就意味着死亡,这是终极的伤害和恐惧。我们多多少少都曾体验过被爸爸妈妈否定的痛苦和恐惧,所以,当爱情———这个亲子关系的复制品再一次让我们体验这种痛苦和恐惧时,我们的情绪很容易变得非常糟糕。
不过,爱情和亲子关系相比,有一个巨大的差别:小时候,我们无能为力,一切都是父母说了算;但现在,我们长大了,我们有力量自己去选择自己的命运。可以说,童年时,我们是没有翅膀的小蜜蜂,但现在,我们有了一双强有力的翅膀了。
但是,当深深地陷入爱情时,我们会回归童年,我们会忘记自己有一双可以飞翔的翅膀。等我们自己悟出这一点后,爱情就不再会是对亲子关系的自动复制,我们的爱情就获得了自由,就有了放弃的力量。
切记:爱情是两个人的事情,两个完全平等的、有独立人格的人的事情。你可以努力,但不是说,你努力了就一定会有效果,因为另一个人,你并不能左右。
所以,无论你多么在乎一次爱情,如果另一个人坚决要离开你,请尊重他的选择。
并且,还要记得,你不再是童年,只能听凭痛苦的折磨。你已成人,你有一双强有力的翅膀,你完全可以飞出一个已经变成毒药的关系。

(七)亲密的寓言:独一无二的玫瑰

小王子有一个小小的星球,星球上忽然绽放了一朵娇艳的玫瑰花。以前,这个星球上只有一些无名的小花,小王子从来没有见过这么美丽的花,他爱上这朵玫瑰,细心地呵护她。
那一段日子,他以为,这是一朵人世间唯一的花,只有他的星球上才有,其他的地方都不存在。
然而,等他来到地球上,发现仅仅一个花园里就有5000朵完全一样的这种花朵。这时,他才知道,他有的只是一朵普通的花。
一开始,这个发现,让小王子非常伤心。但最后,小王子明白,尽管世界上有无数朵玫瑰花,但他的星球上那朵,仍然是独一无二的,因为那朵玫瑰花,他浇灌过,给她罩过花罩,用屏风保护过,除过她身上的毛虫,还倾听过她的怨艾和自诩,聆听过她的沉默……一句话,他驯服了她,她也驯服了他,她是他独一无二的玫瑰。
“正因为你为你的玫瑰花费了时间,这才使你的玫瑰变得如此重要。”一只被小王子驯服的狐狸对他说。

【心理点评】
这是法国名著《小王子》中一个有名的寓言故事,我曾读过十数遍,但仍然是直到2005年才明白这一点。
面对着5000朵玫瑰花,小王子说:“你们很美,但你们是空虚的,没有人能为你们去死。”
只有倾注了爱,亲密关系才有意义。但是,现在我们越来越流行空虚的“亲密关系”,最典型的就是因网络而泛滥的一夜情。
我们急着去拥有。仿佛是,每多拥有过一朵玫瑰,自己的生命价值就多了一分。网络时代,拥有过数十名情人,已不再是太罕见的事情。但我所了解的这些滥情者,没有一个是不空虚的。他们并不享受关系,他们只享受征服。
“征服欲望越强的人,对于关系的亲密度越没有兴趣。”广州白云心理医院的咨询师荣玮龄说,“没有拥有前,他们会想尽一切办法拉近关系的距离。但一旦拥有后,他们会迅速丧失对这个亲密关系的兴趣。征服欲望越强,丧失的速度越快。”
对于这样的人,一个玫瑰园比起一朵独一无二的玫瑰花来,更有吸引力。
然而,关系的美,正在乎两人的投入程度和被驯服程度。当两个人都自然而然地去投入,自然而然地被驯服后,关系就会变成人生养料,让一个人的生命变得更充盈、更美好。
但是,无论多么亲密。小王子仍是小王子,玫瑰仍是玫瑰,他们仍然是两个个体。如果玫瑰不让小王子旅行,或者小王子旅行时非将玫瑰花带在身上,两者一定要黏在一起,关系就不再是享受,而会变成一个累赘。
切记:一个既亲密而又相互独立的关系,胜于一千个一般的关系。这样的关系,会把我们从不可救药的孤独感中拯救出来,是我们生命中最重要的一种救赎。
如果不曾体验过,你就无法知道这种关系的美。

做一棵永远成长的苹果树[zz]

做一棵永远成长的苹果树

一棵苹果树,终于结果了。

第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。“哈哈,去年我得到了10%,今年得到20%!翻了一番。”这棵苹果树心理平衡了。

但是,它还可以这样:继续成长。譬如,第二年,它结了100个果子,被拿走90个,自己得到10个。

很可能,它被拿走99个,自己得到1个。但没关系,它还可以继续成长,第三年结1000个果子……

其实,得到多少果子不是最重要的。最重要的是,苹果树在成长!等苹果树长成参天大树的时候,那些曾阻碍它成长的力量都会微弱到可以忽略。真的,不要太在乎果子,成长是最重要的。

原文点评:
你是不是一个已自断经脉的打工族?刚开始工作的时候,你才华横溢,意气风发,相信“天生我才必有用”。但现实很快敲了你几个闷棍,或许,你为单位做了大贡献没人重视;或许,只得到口头重视但却得不到实惠;或许……总之,你觉得就像那棵苹果树,结出的果子自己只享受到了很小一部分,与你的期望相差甚远。

于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。

“老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。

这样的故事,在我们身边比比皆是。之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。

切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要。

David感想:
初读这篇寓言,惊诧与颤动。其中所蕴含的道理,可能我经常听到,时间久了也不以为然了。有些时候也会提醒自己,不要总是抱怨别人和外部环境,在这点上我想自己做得还是好的。但是总是会有懈怠的时候,总是会有受到诱惑的时候,总是会有看到别人赚钱和迅速的成长而心急的时候。不断肯定自己,又不断否定自己,我究竟在做什么?我真的在成长吗?

我相信很多同学毕业之后,看着周围的同学月薪成倍涨,买车又买房,必然心里会产生些不平衡,会心急会茫然会失望,顿觉前途渺茫。我们努力工作我们付出打杂,可拿刀的薪水跟老人比起来还是差很多,你有没有像上面的那个棵苹果树一样拒绝成长?反正我是有过的感受的,虽然最后都会慢慢接受,会想通想明白,但是这样的感受还是有切身体会的。庆幸的是,我没有拒绝成长,只是有些黯然,之后还是要奋进要努力。

有朋友跟我说,要看得再远一点,多想想几个月之后,几年之后的情景,而不要局限于眼前。是的,我们有什么理由拒绝成长呢?成长是为了自己,而不是为了别人。那么让我也做一课永远成长的苹果树吧!

[zz]杭州163网易研究院面试题目网友汇总篇

 

1.写出对“知之者不如好之者,好之者不如乐之者”的理解。

2.用中文写出尽可能多的中文语句,要求包含有“都”的意思(all、both之意),但不能有“都”字

3.new/delete和malloc/free的区别,并说说你在什么情况下会自另行建立自己的内存分配机制。

4.求极限lim(x-[x]),x趋于-3。

5.比较两个电路的可靠性。

6.编程题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。

7.有两个字符串 str1和str2,写一个函数实现在str1中查找str2的初始位置。要求不区分大小写。

8.在字符串S中寻找最长的字符串x,条件是x存在于S中。即是如:abcabcdcd中的abc。

9.求Fibonacci数列中第k个与前面所有数互质的数(除前面两个数 1,1 )。

10.有100个真币和一个假币,只知道真币与假币不等重,要求只称两次,得出是真币重还是假币重。

11.证明题:给出n个互不相同的分数数列a1/b1, a2/b2… an/bn ,证明(a1 + a2 + … + an) / (b1 + b2 + … + bn) 的值在数列a1/b1, a2/b2… an/bn 数列的最大值和最小值之间。

12. 证明题:在三角形中,假设等角对等边,证明大角对大边。

13. 文学题:在以下的空白中填入相应的词(蔼、断、淡、泰)并解释其含义。

  自处超然,处事 然,无事澄言,处事 言,得意 然,失意 然。

14. 问答题:为什么现在的计算机采用二进制?而不是八进制或十六进制?你认为以后的计算机会采用几进制?

15.程序设计题:给出若干个单词,组成字典,要求查找速度最快。

16.,有b1/a1,b2/a2,....,bn/an 共n个分数,分母同号,证明:

(b1+b2+...+bn)/(a1+a2+...+an)的值在上面n个分数值最大制和最小值之间.

17.证明:三角形中大边对大角,已知等边对等角

18.为什么计算机中多用二进制,16进制也用在程序中.你认为有没有可能回出

现多进制的计算机,为什么

19.一个没有拷贝构造函数和重载=运算符的String类,会出现什么问题,如何解

决?

20.编程题.

有篇文章,找出文章中单词在词典中的序号,要求高效率.词典没排序.

21.有一位警长,抓了三个逃犯。现警长决定给他们一次机会。他拿出3顶黑帽子,两顶白帽子,然后往这三个逃犯头上每人戴了一顶帽子,每个逃犯只能看到另外两个逃犯帽子的颜色,不能看到自己帽子的颜色,而且不能进行通讯,不能进行讨论,只能靠自己的推理推出来,如果猜出来了,放一条生路,否则处死。

警长先问第一逃犯,结果第一逃犯猜错了,被杀掉了。

警长问第二个逃犯,结果还是猜错了,同样被杀掉了。

警长再问第三个逃犯,结果第三个逃犯猜对了。

说明一下,每个逃犯在回答问题时,其他逃犯是听不到的。

为什么第三个一定能猜中,请你给出解释。

August 18

关于push mail

  今天有一家做push mail的公司给我电话,使我产生了一点兴趣。看了一下关于push mail的资料,这里简单总结一下:

1.什么是push mail?

  Push Mail是一项将Email直接推送到移动终端(手机)上的服务。 
  在Push Mail出现之前,用户需手动拨号上网,收取邮件,这是一种Pull(拉)技术。而Push Mail系统能够将用户电子
邮箱中刚刚收到的新邮件在第一时间快速地推送到用户手机上。用户不用再频繁上网登录邮箱,就可随时随地收发处理邮件。 
2. Push mail 的特点:
 Push Mail是将邮件主动推送到手机终端的移动邮件解决方案,能随时将企业邮件推送到用户手机终端上,实现关键信息
随时、随地、随身获得。
3.目前的push mail 有两种形式:
a.鼎鼎大名blackberry 的push方式。与运营商合作,实现底层mail push。

Blackberry依托电信运营商可以在底层就实现Push Mail 功能,从而使他的效率更高,功能扩展更简单。而其他Push Mail 服务只不过是在现有的网络服务上扩展的一个功能而已。就好比OSI 7层模型, BB 在第2层数据链路层就能实现Push 这个动作,而其他人只能在第7层应用层来实现这个服务了。

    b.MS的push 方式。利用运营商的数据服务,通过定时查询来获得邮件信息,来get mail。尚邮 也是采用相同的原理来实现邮件push。

以上是一点转载的更多细节的资料:http://cxxcn.com/pushmail_tech/

Blackberry的pushmail实现原理:

相当于解释了为什么Blackberry要跟各国的移动运营商合作:

Blackberry依托电信运营商可以在底层就实现Push Mail 功能,从而使他的效率更高,功能扩展更简单。而其他Push Mail 服务只不过是在现有的网络服务上扩展的一个功能而已。就好比OSI 7层模型, BB 在第2层数据链路层就能实现Push 这个动作,而其他人只能在第7层应用层来实现这个服务了。

BlackBerry 通过自己的PIN在运营商那里注册,每个PIN 对应一个手机号码,运营商要投入来管理这些PIN。MS 的PushMail也是一样的道理。

MS的Pushmail与BB的Pushmail对比:

和bb不同的是,wm的方式可以完全避开运营商提供特殊服务的环节,只要运营商有internet数据服务,wm的设备就可以通过internet数据服务直接与exchange联系并得到push过来的邮件.当然wifi,与电脑同步也可以,不过那样就不能移动了.
不论ms想怎么部署,不可否认的是,任何wm的设备就是一个pushmail终端 ,不象bb是软硬一起做的厂商,ms不会自己去做硬件终端 ,说wm现在没有pushmail终端是不对 的,最多说做ppcpe的厂商没有重点做pushmail的宣传,毕竟用了wm系统,加上那样的硬件配置 ,谁也不愿意只说自己的设备只是pushmail终端 .
其次,现在所有用exchange sp2的企业,在pushmail上几乎可以无缝过渡,没什么难度,不必为了pushmail再去买bb的服务,也不用去买运营商昂贵的数据流量,wap包月加代理就可以搞定.

最后,根据我的经验,能不能pushmail,不取决于是否wm5设备,ppc2003就可以,只要exchange升级了.

1、用WAP+代理不可能实现真正的Push。

WM5会在后台启动一个进程,时不时跟exchange发生https的交互,时刻保持在wap处留下内外网IP的转换记录确保当exchange有邮件的时候,可以发送trigger到那个内网IP。

wap+代理,在计算机网络的术语中,我们可以称之为NAT(具体实现方式不讲了,有兴趣的可以自行参考其他技术书籍),这种模式的上网方式,只能是由内部发起对外部的访问,外部无法主动发起对内网的访问。显而易见,在这种方式下的PushMail,即使在没有邮件的情况下,仍然会产生GPRS流量,对移动的各个网元GGSN SGSN都是要占用一些资源的,所以严格意义上来说,MS Exchange的PushMail还不算是真正的PushMail,因为在没有邮件的情况下产生了GPRS流量,会产生一定的GPRS费用。

推论:当BES/BIS发现有新的邮件时,就是发送一条短信给客户端,让客户端启动PushMail的进程准备接收新的邮件,这个时候由BES将邮件推到客户端中,在这种方式中,blackberry需要运营商的介入才能完成整个 Push流程,这种是比较干净的PushMail方式,因为不需要用户支付GPRS流量费(在没有邮件的情况下)。
好了,两种方式孰优孰劣对用户来说都一样,感知差别不大,这么点GPRS流量是可以忽略不计的,现在说说移动的PushMail和另外一款面对免费互联网邮箱的pushMail客户端:尚邮
他们的实现方式跟微软的exchange和blackberry有异曲同工之妙。
移动的PushMail就是blackberry的实现方式,尚邮类似exchange,囊中羞涩的用户可以使用尚邮,它可以收取任何一个免费的互联网邮箱,并将其推送到你的手机中,然而有一个安全性的问题,你需要将互联网的用户名和密码告诉尚邮这个客户端,而它是否会搜集这些敏感数据并发送给尚邮这个软件开发商就不得而知了。而中国移动还是有比较高的信用度的,希望能得到安全保障的用户还是选择移动的139邮箱吧。

2、MS的Direct Push过于依赖于Exchage Server,估计应用的范围大不到哪去?如果大家使用BB、WM都是用来收集POP3邮件的话,其效果倒也差不了多少。不过,如果大家都这样来使用 pushmail服务的话,估计免费的服务器是难以负担其沉重的负荷啊!
尚邮也实现了类似的功能,它是一个免费的手机客户端,个人用户也可以尝试一下,而没有必要非要用MS的exchange。它可以将新浪、gmail、yahoo、QQ的邮件推送到手机中,很有吸引力吧?呵呵。

3、看来看去BB的pushmail还是最佳的解决方案,那就是和运营商合作,而且具有低维护成本的绝对优势。
对于广大迫切需要得到PushMail功能的个人用户而言,中移动的139邮箱才是最合适的选择,因为费用极低,5元每月,而且还免费到今年年底(2008),BB的好在于他将一大堆东东整合成一个完整的解决方案,企业需要一个稳定的东西,价格高点也在所不惜,139邮箱还是差了点,稳定性不高。
4、至于Nokia或是其他厂商的pushmail解决方案,好像大多数是要得到RIM的授权吧!比如,Palm设备虽然也支持Direct Push,但Palm仍然授权了RIM的Pushmail解决方案。

结论:BB的Pushmail解决方案还是王道。虽然其他厂商也提供类似的解决方案,但RIM仍处于这个产业的上游,也就是说“立于不败之地”。也许,有一天RIM不做硬件了,专心为其他厂商提供pushmail的解决方案。

 

August 16

[zz]什么是“糖水片”?

 

偶尔看到一篇文章,觉得写得挺有意思,就转来了。
——————————————————————————
“糖水片”这个名词虽已在摄影界喊烂,但我曾认真问过不少摄影人,却没人能全面系统地说清。不过,我首先提请大家注意的是——无论自然风光、风景、人像、静物、民俗、纪实、观念等类别,“唯美”风格的照片并不是糖水片,因为“唯美”毕竟是美之一种,风格之一种。而我以往之所以毫不留情地狠批过,针对的其实是摄影人群起而追之的千人一面现象;尤其是“自然风光”类,不仅表现在严重的同质化上,也还存在着所谓几个“风光大师”之类的意见领袖只认定“唯美”是至高境界的错误评论与引导,由此而成为影响中国摄影向全方位多维度发展的巨大障碍。
但究竟什么样的照片才算“糖水片”呢?这问题说复杂就复杂,说简单也简单。所谓复杂,主要是因为拍糖水片的人并非一点想法或追求也没有,也不可能象“植物人”或“机器人”那样去拍,所以对一般观看者来说,并不是很容易就能分辨清楚。而所谓简单,其实只需抓住照片乃至拍摄者的几条特征,便可一目了然。以下我想开列主要的三条,纯属个人看法,仅供参考——
1、只有技术-没有艺术
许多糖水片都是很讲摄影技术性的,比如光圈、焦距、白平衡、感光度、曝光、色彩、色温、饱和度、明暗、虚实、景深、层次、反差等等,也很讲究所用的相机、镜头、胶卷及其它设备之类。他们对“美”的理解,更多其实就是技术;同时也把这些通过各种技术所拍出来的片子误认为就是艺术了。
我以前讲过,艺术的基本特征是“模仿现实-提练现实-超越现实”,三阶段缺一不可;而更高的层次则是“思想就是艺术”。糖水片多半只停留在“模仿现实”的阶段上,虽有少部分可达到“提练现实”这一层,但绝无“超越现实”的思想高度。许多糖水片往往还把“美化现实”误认为就是“美”乃至“超越现实”,这其实是糖水片最大的症结所在。“美化”绝不是美,只是虛假粉饰,是骗人的东西。
城市“写真照相馆”所拍出來的照片就是这种“美化”出来的典型糖水片。这种写真并不是将某人的优点进行艺术性的放大或突出表现,而是全力掩盖某人的缺点,比如用描眉或画眼影的化妆手段把小眼睛变大,用拍摄时的柔光镜效果来掩盖某人脸上的皱纹之类。那人的眼睛虽大了,但不是她了;那人脸上的皱纹虽没了,但那张有血有肉的脸也没了……而照片反映出的最后结果只能是那人的一张假脸!
2、只有构图-没有意图
凡是平面视觉的东西就有构图,诸如对角线、平行线、三角形、梯形、对称、不对称、面积、体积、远近关系、虚实关系、主次关系、轻重关系等等。但这些只是视觉要素问题,是一张好照片所包含的一部分因素,并不是全部或者重点。重要的是你的这张照片想干什么?想表达什么?倘若摄影人只把构图看作是一张照片顶顶要紧的事,其构图就是拍这张照片的意图的话,同样是把构图误作了“美”,其充其量只是“形式美”而已,除此之外,你在那张照片里就再也看不出什么东西了。
比如花卉类的照片,绝大多数只有色彩、光晕、造型、构图。再比如自然风光类的照片,那山、那水、那云、那月、那树、那石等等,体现的也仅是构图与光影技术;许多画面效果虽不乏“清新剔透”或“烟雨朦胧”,有的甚而也“美化”了那个自然风光,所谓色彩绚丽、画面干净之类,并以此认为“美”,这也正是我下边要讲的“只有感官美-没有心灵美”的问题。
3、只有感官美-没有心灵美
给人的感官造成一种表相的“美”,其实很容易达成。这就如同让你看見一位“美女”,无非是一张漂亮脸蛋和魔鬼身材而已,三陪小姐就能办到,至于那位“美女” 有无文化修养、伦理道德、丰富气质等等,其实稍有人生阅历者,也能从她的言谈举止中一眼看个八九不离十。以此对应“糖水片”来说,那糖水片就是——只有皮相的美貌,没有內在的气质、修养、才华!古希腊思想家普罗丁早就认为美是有等级之分的----感官是低级,心灵才高级。
当然,这里我其实还可罗列几条诸如“只有假相-没有真相”、“只有冲动-没有感动”、“只有糖水-没有泉水”之类说词,恕不多论了。此文旨在抛砖引玉,大家或许还能谈出比我更多的释疑与判断标准,谢谢!

August 02

20090802工作

我一直面临一个很严重的问题 就是如何让自己的阅读成为有效阅读,也许是不专心 也许是兴趣不在此,所以经常出现看过了 只能留下一点印象 而不能真正自己的知识。这个问题 我一直没找到很多的解决办法。

July 27

bbweather使用方法+感受【加入截图】

bbweather使用方法+感受【加入截图】

本帖最后由 hkwon 于 2009-2-26 00:21 编辑
我的机子是87,4.5rom。今天看见发了新版的bbweather就下来试试。【插入一下:之前一直用的是细搜,果然界面华丽,但美中不足是体积有些大,网络有时不够稳定,尤其是定时更新失败一直停留在空白界面。我还保留细搜的一个重要原因是即时显示农历,这对中国的bber们太重要了】下面是我的使用报告,讲述bbweather 的设置方法和使用感受。
------------------------------------------------------------------------
安装完以后要进入设置界面设置需要查询的城市,查询城市代码的网址在之前的帖子里有,我平时可能需要查询的城市是南京,沈阳和北京,至少这三个城市都能查到,其他的地名我没有试,不知道具体会覆盖哪些城市。bbweather可以同时设置多个城市,但不清楚最多可以设多少个,我设了三个。重要的是不同城市间可以通过快捷键切换。
城市设置以南京为例:
Location ID : CHXX0099
Description : 南京(也可用拼音,这是给自己看的,会显示在菜单上方便识别)
接下来两项是预报天数和按小时查看情况的条目数,可根据需要设置,我的天气预报设为三天,天数设置太远用不上,而且变数很大可能不够准确。按小时查看情况的条目数我设为最小值10,也就是说现在是晚9点,可以具体查看未来十小时内的天气情况,晚10点,晚11点等等。
接下来,Units是“单位”,选择metric,即公制,就是摄氏度,否则是华氏,离中国人的直觉比较远。
Shortcut Key :n (同理,沈阳就是s,北京是b,以自己好识别记忆为准)
城市设置完毕后进入软件设置。
首先是实时(当前)天气和桌面图标变化的时间间隔,单位分钟
其次是天气预报(即前面设置为n天的)的更新间隔,单位分钟
分割线下面是设置桌面图标变化的选项。打钩即可在桌面显示当前的天气情况【这点很赞】。下面可以选择图标的内容,可以选择“天气状况+温度”,南京在小雨,我这里的效果是桌面图标变成云朵在下雨,并且在图标上显示3度,光标移到图标会将程序名处显示天气,温度,日期,当前城市快捷键的字母(让你知道当前显示的是哪个城市的数据)。下一项是仅当光标移到程序图标时显示天气状况,如果前面一项像我已经选择了“天气状况+温度”那么这里可以选择“none”。下面是选择图标上显示温度的字体。
接下来的内容是程序的运行选项。打勾处选择是否随开机启动,安装软件后我还没关机或重启,还没法测试是不是能开机启动。下面选择网络,我选auto,即"自动",接下来是退出键选项,可选择“完全关闭”“最小化至后台”和“询问”,按需要选择即可。
再接下来是设置温度显示的颜色,自定义当前温度,日最高温和日最低温显示数字颜色,默认即可,也可以选择自己喜欢的或者能表达情绪的颜色。
全部设置完毕以后点击save后退出。
------------------------------------------------------------------------------------
回到bbweather的界面。
bbweather的界面很直观明了,图文并茂,白色做底可能感觉不够华丽但也挺漂亮了。bbweather的主界面有三种显示模式,一是当前天气详细状况,而是n天天气预报(以天计),三是未来n小时预报(以小时计)。
在当前天气状况中有以下内容:分三列。左边一列是天气状况和直观图标,中间一列是当前温度和感觉温度【这点很妙,比如现在南京为4度,显示feels like 0度】,右边一列是一些其他参数(有些可能用不到,但是也有可能偶尔能用到)依次为:紫外线指数,风向风速,湿度,气压,露点(结露水的温度),能见度,日出日落时刻和月相。这些对87这样的横屏来讲只一屏就显示了,不用滚屏。
如果想查看n天天气预报和未来n小时预报的话可在呼出的菜单中选择,特别地,当前天气和未来n天预报可以通过空格键来切换。在以上三种任何一个界面内可单击设置的城市快捷键切换预设城市,十分方便。
在程序按照已设置的更新间隔更新的同时,可以随时呼出菜单中的update now立即更新数据。
------------------------------------------------------------------------------------
总之,bbweather的表现令我十分满意,不过尚不知这款软件是不是很费流量。但是流量应该可以通过改变更新频率控制,况且现在移动gprs资费大降价,应该没什么问题。
遗憾之一是设置城市需要代码,如果在外旅游的话临时查询不是很方便,要用bb先上网找代码再查询。细搜也是如此。
【补充,有回帖网友说可以用内置的搜寻代码,刚试了一下果然可以,只需现在 location id出写要查地方的拼音,呼出菜单搜,然后结果自动显示。截图如下】
遗憾之二是没有中国农历显示,但是这个遗憾也只能自己遗憾了,bbweather是国外软件,这个不能强求。这点也是我保留细搜的重要原因。
我本人对细搜还是很支持和看好的,毕竟是本土软件,贴近国人需要。也希望细搜团队能扬长避短,为bber们带来更令人惊喜的软件。
感谢所有为bb写软件的作者和团队,是你们让我们手中的bb更易用,让我们有bb的生活更美好。
最后希望大家 爱生活,爱bb!
-----------------------------另附“天气词汇中英文对照表”供大家使用对比-------------------------------
    01 Sandstorm, Duststorm, Sand, Dust 浮尘,扬沙,沙尘暴等沙尘天气
    02 Thunderstorms, Thundershowers, Storm, Lightning 雷暴,雷阵雨,风暴,闪电
    03 Hail 冰雹
    04 Blowing Snow, Blizzard, Snowdrift, Snowstorm 吹雪,大风雪,堆雪,暴风雪
    05 Snow Showers, Flurries 阵雪,小雪
    06 Snow, Heavy Snow, Snowfall 雪,大雪,降雪
    07 Light Snow 小雪
    08 Sleet雨夹雪
    09 Showers, Heavy Showers, Rainshower 阵雨,强阵雨(从降雨强度及降雨量上)
    10 Occasional Showers, Scattered Showers零星阵雨(时间、空间上不连续的阵雨)
    11 Isolated Showers局地阵雨(空间分布上比Scattered Showers范围更小的阵雨)
    12 Light Showers小阵雨
    13 Freezing Rain冻雨
    14 Rain雨
    15 Drizzle, Light Rain毛毛雨,小雨
    16 Fog雾
    17 Mist轻雾
    18 Smoke烟雾
    19 Haze霾
    20 Overcast阴
    21 Sunny Interval, No Rain, Clearing多云间晴
    22 Sunny Period, Partly Cloudy, Partly Bright, Mild晴间多云
    23 Cloudy, Mostly Cloudy多云
    24 Bright, Sunny, Fair晴(尤指白天)
    25 Fine, Clear晴
    26 Windy, Squall, Stormy, Chill, Gale风,狂风,暴风,寒风,大风
    27 Wet, Humid潮湿
    28 Dry干燥
    29 Freezing冰冻
    30 Frost霜冻
    31 Hot炎热
    32 Cold寒冷
    33 Warm暖和(升温)
    34 Cool凉爽(降温)
    35 Dew Point(露点)
    36 Humidity(湿度)
    37 Wind(风力)
    38 Visibility(能见度)

July 18

[zz] #pragma 指令

在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 
    其格式一般为: #pragma  para 
    其中para为参数,下面来看一些常用的参数。 

(1)message 参数

    message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,
这对于源代码信息的控制是非常重要的。其使用方法为: 
    #pragma  message("消息文本") 
    当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 
    当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,
此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,
可以用下面的方法:
    #ifdef  _X86 
    #pragma  message("_X86  macro  activated!") 
    #endif 
    我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_86  macro  activated!"。
我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 

(2)另一个使用得比较多的pragma参数是code_seg

    格式如: 
    #pragma  code_seg( ["section-name" [, "section-class"] ] ) 
    它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 

(3)#pragma once  (比较常用) 

    只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,
但是考虑到兼容性并没有太多的使用它。 

(4)#pragma  hdrstop

    表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,
但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。   
    有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。
你可以用#pragma  startup指定编译优先级,如果使用了#pragma  package(smart_init),
BCB就会根据优先级的大小先后编译。   

(5)#pragma  resource  "*.dfm"

    表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体 
外观的定义。   

(6)#pragma  warning( disable: 4507 34; once: 4385; error: 164 )
    等价于: 
    #pragma  warning( disable: 4507 34 )    //  不显示4507和34号警告信息 
    #pragma  warning( once: 4385 )          //  4385号警告信息仅报告一次 
    #pragma  warning( error: 164 )          //  把164号警告信息作为一个错误。 

    同时这个pragma  warning  也支持如下格式: 
    #pragma  warning( push [, n ] ) 
    #pragma  warning( pop ) 
    这里n代表一个警告等级(1---4)。 
    #pragma  warning( push )保存所有警告信息的现有的警告状态。 
    #pragma  warning( push, n )保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。   
    #pragma  warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如: 
    #pragma  warning( push ) 
    #pragma  warning( disable: 4705 ) 
    #pragma  warning( disable: 4706 ) 
    #pragma  warning( disable: 4707 ) 
    //....... 
    #pragma  warning(  pop  )   
    在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。 

(7)#pragma  comment(...) 

    该指令将一个注释记录放入一个对象文件或可执行文件中。 
常用的lib关键字,可以帮我们连入一个库文件。如:
    #pragma  comment(lib, "comctl32.lib")
    #pragma  comment(lib, "vfw32.lib")
    #pragma  comment(lib, "wsock32.lib")
每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。

例如,对循环优化功能: 
#pragma  loop_opt(on)     //  激活 
#pragma  loop_opt(off)    //  终止 

有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,
如“Parameter  xxx  is  never  used  in  function  xxx”,可以这样: 
#pragma  warn  —100         //  Turn  off  the  warning  message  for  warning  #100 
int  insert_record(REC  *r) 
{  /*  function  body  */  } 
#pragma  warn  +100          //  Turn  the  warning  message  for  warning  #100  back  on 
函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。 

每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。

补充 —— #pragma pack 与 内存对齐问题

    许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k
(通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。

    Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则:
    任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),
就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

    Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):
    任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型
(比如long,double)都以4为对齐模数。

    ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。
填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?
有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。

如何使用c/c++中的对齐选项

    vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。
n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。
也就是:
    min ( sizeof ( member ),  n)

    实际上,1字节边界对齐也就表示了结构成员之间没有空洞。
    /Zpn选项是应用于整个工程的,影响所有的参与编译的结构。
    要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation分类,在Struct member alignment可以选择。

    要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令:

(1) #pragma  pack( [ n ] )

    该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合的紧凑对齐由/Zp 选项设置。
紧凑对齐用pack编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。
该编译指示对定义无效。
    当你使用#pragma  pack ( n ) 时, 这里n 为1、2、4、8 或16。
    第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n 字节界限内。
如果你使用无参量的#pragma  pack, 结构成员被紧凑为以/Zp 指定的值。该缺省/Zp 紧凑值为/Zp8 。

(2) 编译器也支持以下增强型语法:
    #pragma  pack( [ [ { push | pop } , ] [ identifier, ] ] [ n] )

    若不同的组件使用pack编译指示指定不同的紧凑对齐, 这个语法允许你把程序组件组合为一个单独的转换单元。
带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。
    编译指示的参量表从左到右读取。如果你使用push, 则当前紧凑值被存储起来;
如果你给出一个n 的值, 该值将成为新的紧凑值。若你指定一个标识符, 即你选定一个名称,
则该标识符将和这个新的的紧凑值联系起来。

    带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。
如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值, 并且将产生一个警告信息。
若你使用pop且指定一个n的值, 该值将成为新的紧凑值。若你使用p o p 且指定一个标识符,
所有存储在堆栈中的值将从栈中删除, 直到找到一个匹配的标识符, 这个与标识符相关的紧凑值也从栈中移出,
并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,
将使用命令行设置的紧凑值, 并且将产生一个一级警告。缺省紧凑对齐为8 。

   pack编译指示的新的增强功能让你编写头文件, 确保在遇到该头文件的前后的
紧凑值是一样的。

(3) 栈内存对齐

    在vc6中栈的对齐方式不受结构成员对齐选项的影响。它总是保持对齐,而且对齐在4字节边界上。

[zz]查看lib 函数list

最近遇到个库文件,lib.a,想知道里面是不是网络相关的一个库文件。于是就想到要把这个库文件的函数的list给导出来。

查了不少资料,后来终于找到方法,现总结如下:

比如lib.a文件,我们可以通过如下的方法来进行操作。

1。dumpbin lib.a /linkmember

这个dumpbin虽然是微软上vc上自带的工具,但是用于arm上出来的也是可以的。

当然,如果记不住这个参数,可以直接用dumbbin lib.a /all

2.这个方法虽然麻烦但是对于更好的理解lib.a作用比较好。

1。armar -x lib.a

这个直接把这个lib.a里面的.o组成文件给释放出来。-x参数及时把.o文件给释放出来。

2。fromelf –s test.o

这个命令可以把test.o文件的函数名字给列出来。

July 17

成员数据指针

1.2 成员数据指针
     有如下的结构:

struct MyStruct
     {
int key;
int value;
     };

     现在有一个结构对象:

     MyStruct me;
     MyStruct* pMe = &me;

     我们需要 value 成员的地址,我们可以:

int * pValue = &me.value;
//或
int * pValue = &pMe->value;

     当然了,这个指针仍然是属于第一种范筹----常规数据指针。
     好了,我们现在需要一种指针,它指向MyStruct中的任一数据成员,那么它应该是这样的子:

int MyStruct::* pMV = &MyStruct::value;
//或
int MyStruct::* pMK = &MyStruct::key;

     这种指针的用途是用于取得结构成员在结构内的地址。我们可以通过该指针来访问成员数据:

int value = pMe->*pMV; // 取得pMe的value成员数据。
int key = me.*pMK; // 取得me的key成员数据。

     那么,在什么场合下会使用到成员数据指针呢?
     确实,成员指针本来就不是一种很常用的指针。不过,在某些时候还是很有用处的。我们先来看看下面的一个函数:

int sum(MyStruct* objs, int MyStruct::* pm, int count)
    {
int result = 0;
for(int i = 0; i < count; ++i)
          result += objs[i].*pm;
return result;
   }

     这个函数的功能是什么,你能看明白吗?它的功能就是,给定count个MyStruct结构的指针,计算出给定成员数据的总和。有点拗口对吧?看看下面的程序,你也许就明白了:

     MyStruct me[10] =
     {
      {1,2},{3,4},{5,6},{7,8},{9,10},{11,12},{13,14},{15,16},{17,18},{19,20}
     };
int sum_value = sum(me, &MyStruct::value, 10);
//计算10个MyStruct结构的value成员的总和: sum_value 值 为 110     (2+4+6+8++20)
int sum_key = sum(me, &MyStruct::key, 10);
//计算10个MyStruct结构的key成员的总和:   sum_key 值 为 100       (1+3+5+7++19)

     也许,你觉得用常规指针也可以做到,而且更易懂。Ok,没问题:

int sum(MyStruct* objs, int count)
     {
int result = 0;
for(int i = 0; i < count; ++i)
       result += objs[i].value;
return result;
     }

      你是想这么做吗?但这么做,你只能计算value,如果要算key的话,你要多写一个函数。有多少个成员需要计算的话,你就要写多少个函数,多麻烦啊。

July 12

[zz]在华为工作十年的感悟

(注:本文作者,徐是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万,数据中心是用火山岩建的深入地下的一个大型建筑。防辐射,可 防卫星的电子,雷达等手段的侦察。里面有象卫星发射中心那种超大屏幕,机房里满是三米的大型服务器和大型计算机。连接整个华为全球的每一台终端,整个华为每天三十多万封邮件,海外和全球的同步研发,内部的信息管理,内部流程,华为的国内国际ip电话都是通过出去。)

正文:

上周,我正式提交了离职报告,准备给自己的职业生涯一个很大的转折,这是我长时间的思考最后所做的决定。但真的提出离职后,回想在公司的十年,还是百感交集。

1997 年7月16日,我只身提着一个包从深圳宝安机场下飞机,走出机场,天是那么蓝、白云那么低、空气那么潮,仰头望天,对这个城市,对公司、对即将开展的工作和生活、对自己的前途一片茫然。到了科技园,发现是个荒凉而偏僻的地方,不过倒很安静,上学的几年中,一连串的打击,使得我似乎有点喜欢这种安静、荒凉、在他乡的感觉。现在想想,经过十年的工作,自己的心灵真是麻木得可以了。那时候的心里,好像时时有些什么没有着落的东西在激荡,但又说不出来,只有在听德沃夏克的《自新***交响曲》时,才发现多有深处的共鸣以至落泪。

由于没赶上大批应届生的接待,我是自己一个人来到科技园1号楼的,干净整洁的大楼,很帅很靓的保安和前台,进进出出精神饱满的员工,让人的心情为之一振。象没头苍蝇一样乱走了一会后,一位人力资源的大姐,很职业、热情、耐心的告诉了我入职手续如何办理,并安排我当晚在粤海门华为之家临时居住,又安排之后的宿舍事宜,在举目无亲的异乡让人倍感亲切,至今记得。

来深圳、来华为当时确实是一种机缘,96年华为名气并不响,特别是在行业之外,偶尔一次我在同学家里看到一张华为人报,有几片文章印象至今很深:一篇是周劲写的欧洲考察心得,讲欧洲一个20-30人的小公司,所具有的那种全球化运作战略、能力和气度。一篇是唐东风写的被评为杰出员工受表彰后的感想。还有一篇名头很大“中央研究部知识产权处”,当时被这个名头吓了一跳。文中讲到华为当年研发累计投入1.8亿人民币,更让我吓一个跟斗。我想当时清华大学一年科研经费也就1亿多点,这家公司什么来头,花的科研投入比清华还多?当时就有了兴趣。

快毕业的时候,连连受挫,找工作跟当年大部分同学一样,希望留北京,但连续被联想、方正、科海、卫通等当时大名鼎鼎的公司录取后又告知要交几万块钱才能解决户口问题之后,想到了还有华为这样一家公司,给人力资源部寄了一份简历。没几天,一个深圳的电话,说某年某月某日有个副总裁来北京,面试一下。抱着试试看的态度跑过去了,是公司原副总胡红卫,他基本上没有问我什么问题,到是介绍了一下华为的情况,然后把人力资源经理田景琦叫了过来,当场就给了我一个“录取通知函”和入职操作指导。我一肚子犯嘀咕,这是不是一家骗子公司?怎么这样就算面试通过了?连工资有多少都没有机会问。之后一直到报到前,都有点怀疑,幸好有个本科的同学,在华为工作过,在向他咨询后了解到公司还是实实在在有的,才下了决心过来。总的说来,就是被一张华为人报“骗”来的。

就这样懵懵懂懂到了华为,一开始新员工培训,纪律严明、严格,班车不会多等半分钟,之后是部门培训,大量的信息扑面而来。之后到了工作岗位上,给我分配的 工作是ERP系统管理员兼DBA,虽然以前也搞过一些大系统,如兼职做过印度人的大型银行软件的客户化开发,但见到我们的ALPHA 8200和我们的软件ORACLE,心里还是激动不已。 IT的发展一日千里,10年前的技术与今天比,很多人可能没有体会了。那时比较落后,很多人也没有机会接触这种当时很先进的系统。我见到我们居然有2G巨大内存的“超级服务器”当时实在是佩服不已,为自己能做它的管理员而自豪,又为自己将来能不能玩转它而焦虑。我师傅王忠宁见到我就撂给我一本书《ORALCE ADMINISTRATOR GUIDE》,一寸半厚的英文书,愣是一周之内从头到尾看完并写了厚厚的读书笔记和一大堆不懂的问题,自此再也不怕厚厚的英文书。

当时正好是公司ERP上线没多久,业务正在推行,系统极不稳定,每天的并发程序有一半是跑错的,系统还会动不动 CRASH。我看完一本书后,在刚刚成为 One Book Man时,问题单就来了,有一个重要的××引入程序有时候跑得出来,有时候跑不出来。说实话,那时候对ERP、ORALCE、操作系统一切几乎还是一头雾水,而问题却已经传过来了,只好硬着头皮,摸索了好半天,终于明白了有一批数据在倒的时候,系统准出错。几万条数据,一条条试是不可能的,我就想出了用二分法,一批一批的试,完全手工动作,笨拙、费时、费力,做了几十遍,花了整整一天中午饭都错过了,终于定位到了其中一条数据,而后发现是数据超长而数据库定义的长度不够并且校验程序有BUG没校验出来。经过又返回去重复验证,证明找到的原因是正确的。当时真是心中大喜,几乎在完全不懂系统、不懂这个程序是做什么的、不懂程序处理的逻辑、不懂数据库的设计的情况下,把这个BUG定位出来并交回给ORACLE处理了。这是我上班后解决的第一个问题,至今我对这个问题本身还并不明白,呵呵。这让我懂得了一个道理,工作和读书不是一回事,工作是要解决问题的,是要产生结果和输出的。不管怎么样,能找到方法解决问题、能够有好的输出结果那就是成功。读书才追求的是慢慢读,读懂为止。

那时的系统,真是岌岌而可危,公司的业务高速发展,业务也不断推行,系统的负荷越来越高,但系统却不是经常宕机,就是跑得如老牛般慢。我们的技术水平和管理水平,也是与现在不可同日而语。水平不行体力补,大家兢兢业业背负责任,闯过种种难关,终于还是挺过来了。现在想想,还真是有点后怕的,稍有不慎真有可能全线崩溃。我也能理解有些大企业,为什么倒起来那么快了。现代的组织,经常是高度复杂的组织,就象生物一样,低等的蚯蚓断成两段,照样生存。而高等的人,身上戳个小小的洞可能得毙命。高度复杂的组织,就象人体一样,内部小小一块地方如果出关键问题了,组织可能崩溃。要保证不崩溃只有两条路:1)组织本身的设计和流程的设计高度科学、冗余和足够的制度性反应机制,这是西方国家的强项,他们的公司历一百年不倒,是有强大的内在因素的。2)依靠组织内每一个最小单元的高度的负责、警觉。虽然我们多年来一直在强调第一种能力的培养,但我们天生缺少这样的土壤和基因,因此第二种能力变得十分重要,虽然这不是最好的办法。

头两年的工作中,我们水平很低,体力劳动很多,有一段时间,我一上班就得高度紧张地盯着系统,不停地干预,系统才能跑下去。一会儿系统进程死了,一会儿空闲进程多了要杀掉,一会儿表空间不够了要扩展,一会儿用户提交了不合理的并发程序要中止…有一段时间,我成了热线兼现场支持,一天接50-80个电话,接了电话到处跑。之后我们做了很多改进工作,升级了系统硬件、写了自动脚本,成立了专门的热线等等,这期间我慢慢懂得了一个道理,一个大的复杂系统要成功的管理好,没有绝招,依靠的只是一点一滴持续不断的改进和努力。

有一度由于压力过大,也使我精神高度紧张,到了比较神经质的地步,有一段时间,一听到CALL机响,甚至是电视广告里的“摩托罗拉寻呼机,随时随地传信息 ”中的BP声,我的心跳就不由自主加速,喉咙发干。有一次去香港出差,从出发开始就一直惴惴不安,生怕系统出问题,结果刚到香港住进酒店,一个电话就来了,说系统崩溃了。我立即打国际长途叫赵×赶紧去处理,过了几分钟,赵回电话绝望地说,他以最快速度赶到一号楼,进了电梯刚走到一半,喀嗒停电了,电梯卡在中间半个多小时,祸不单行,当时那种感觉真是 “农夫内心如汤煮”啊。最后过度紧张使得我想逃避,导致我提出了辞职。所幸那时候的领导袁总和郭总,开导我多次,我逐渐有所缓解,然后慢慢开始理解了什么叫大将风度。做我们这一行,要如履薄冰、但也要有点临危不惧的精神。工作紧张,但心情要避免无谓的紧张。后来我们的ERP系统、IT数据中心,又出现过多次危险情况,淹过水、着过火,而我们最终都能够化险为夷。

工作并不只有艰苦和繁琐,有时候,乐趣也不期而至。当时我们的数据库总是出ORA-1555错误,严重影响系统的运行,我多天努力、百思而不得其解。现在的管理员可能会想,这不是一个小问题吗,但那时网络还没现在这么发达,什么东西一GOOGLE都出来了,我找了大量的资料,苦苦思索,最后终于灵光一现,象拼藏宝地图一样拼出了逻辑严密的解释和解决方案,我记得当时是深夜,内心偷着乐的感觉妙不可言,不需要别人知道、不需要别人理解,走出公司大门,仰望星空,深深吸一口气,内心偷着乐。还有另一次,当我们经过30多个小时的连续作战,解决种种问题,终于顺利升级成功ERP系统后,那种感觉也象打了胜仗的将军,充满胜利的喜悦。记得当时正是刚谈女朋友,给她写了第一封也是唯一一封情书,成为太太后,她有一次跟我说,你那玩意儿叫啥呀,那能叫情书吗?通篇都在讲你如何如何工作的,象工作汇报一样,简直可以跟鲁迅写给许广平的“情书”相媲美,尽是革命理想,没有点花前月下…..还有一次,我们的EMAIL系统突然出了故障,大量的来信收不到。那时是华为开拓海外市场的初期,海外还根本没有什么公司网络,所有的一切都是靠EMAIL和国际长途,天象塌下来一般,我们跟主管国际市场的徐直军汇报、最后向老板汇报请示是否应该报公安,因为当时的故障现象很象DDOS攻击。系统停了整整七天,我们请了各路专家,日夜攻关,试了N个方案,大家象大禹治水一样过家门而不入。最后还真找到了一个木马“冰河”的攻击,但却发现不是根本原因,故障依旧。最后一天晚上,我与阿韦坐在科技园一号楼冰冷的网络机房,看着系统一封一封的邮件,连接了,又中断了,一筹莫展,濒临崩溃。我抱着死马当活马医的心态,又祭出了我的“二分法” 体力活,测试了一封空邮件,能成功;测试了一封大邮件,失败;取其中间值,又失败;再取中间值,成功;再取前两次的中间值,成功…..一直到深夜,试了N次,终于总结出了规律!再一验证,只要在某个大小的地方,比它大的统统收不到。重要发现!然后改用PING包,发现在一千四百多字节的地方,再大就 PING不通了,现象可重复。再去想理论,如果按协议理解,这也不可能啊,即使MTU调小了,大包超过MTU也应该自动分片啊?除非是MTU在某个地方调小了,而协议又有异常。发现这个规律后,阿韦立刻跟电信联系,果然是一周前电信调整了路由器MTU并且CISCO的路由器有BUG引起。问题就此解决,当时吸了口气,那种舒坦啊!…没经受过类似极限考验的人可能不容易理解那种快乐!这种快乐是工作本身带来的,不需要别人来表扬,甚至不需要别人知道。能够有机会也能用心去体会这种快乐的人,怎么会不热爱工作?

工作也肯定不是只有成功和荣誉,有时候我也做很多蠢事和傻事,或者由于幼稚被人骗,或者是由于轻率导致工作失误。有一段时间,ERP系统岌岌可危,系统容量面临崩溃。我多次大声疾呼,几乎每一次有机会见到CIO郭总都大呼小叫一番。郭总当时刚来我们部门,一开始觉得我这个人怎么能这样?在一次部门全体会议上,郭总点名批评“徐家骏总是瞎咋呼,只会威胁我,却拿不出一个好的方案”。心里相当郁闷,但系统还在我手里,能等着它死吗?我还是一如既往的瞎咋呼,但也改进了一点,拿出了方案。郭总批准花了500多万来改进系统,这次给了我们1 -2年的稍稍太平时间,从而有机会做更多的改进优化工作。当时的500多万跟现在的概念可大有不同,现在IT花个500多万是小菜,那时500多万可是天文数字啊!当时相当佩服郭总的魄力,记得他要做大笔花钱的决策时,常说的一句话是“牛都杀了,还在乎牛毛?!”。很久以后,郭总有一次提到,徐家骏这个人工作还是蛮执着的。后来我的职位不断地得到了提升。之后我负责了很多重大的项目,往往涉及重大的投资,几百万、几千万,这些年来总共给公司花掉好几个亿。这中间技术方案制定,也有被忽悠了的。甚至重大项目投标时,有供应商恶毒的投诉诬蔑我的事,所幸公司及领导给了我这样的土老冒充分的信任。这些事我的体会是:只要你心无旁骛,目标单纯,就是想把这个事情搞好,并且持续地、啥都不计较地、傻傻地去推动,内心无愧,一时可能会有工作失误,一时可能会得罪人,可能会有人不理解,但长远来看还是会得到公正的承认的。

公司快速发展和扩张,由于工作业绩还过得去,很快就被提拔为小主管了,一开始觉得做主管也没啥,业务的细节我都是一清二楚的,不就是多了几个人一起干活吗?有一次,IT二把手袁总说“我要参加一次你组织的部门例会,看看你是怎么做管理的”,没问题,在例会上,我侃侃而谈,把业务分析得透彻细致,把工作安排得井井有条,洋洋得意地结束了会议,期望着袁总能给点表扬。袁总一声不吭坐到结束,等人都走了,劈头盖脸一顿“徐家骏,你知道这叫什么吗?这叫生产队长!农民!…”,一开始还不服气,我业务这么清楚、工作安排得这么妥当,管理能力还不行?后来,慢慢地自己也发现了问题,后来部门安排了去参加封闭4 天的管理干部培训,才算接触到了管理ABC,渐渐体会到,原来管理也是一门学问,而且大有学问。有了这个认识,后来我也时时留心。其实在华为要学习管理最简单,第一要诀是向身边的人学,华为的很多管理者,修养和能力超强,在平时和他们一起工作的一点一滴中,如果你细心去观察和体会,收获实在可以不少。比如说,有一段时间,我每周参加IT部门干部例会时,大家讲得差不多了,该由领导作判断和决策、做工作安排之前,我就会猜,领导可能会做有什么判断、会做什么决策,特别是有些事情充满矛盾和冲突,需要权衡时。一开始十猜九不中,并且很多看法别人说出来之后觉得耳目一新、不胜佩服。于是就去想他为什么会这样判断和决策,背后做的功夫是什么,慢慢地自己处理类似问题的思路也比较开阔了。另外、别人在管理中犯的错误,也是自己学习的好机会,自己犯错误自己是不容易觉察的,但别人犯错误自己可以觉察,然后可以警醒自己避免类似错误。

后来,做数据中心经理、技术支持经理、IT基建经理、系统运作副总监,变做边学,做团队管理、做考核、做流程优化,应对种种难题:如用户严重不满、工作头绪繁多流程乱来、资源严重紧张、骨干员工要离职、刺头员工提种种要求、部门骨干之间文人相轻、部门之间配合大起冲突、末位淘汰等等等等,逐渐逐渐对管理的体会越来越深,对管理的重要性认识越来越深。应对这些难题,当时真是殚精竭虑,有时甚至痛苦不堪。但我事后的体会是,凡是自己在感觉严重受挑战、整天闹心痛苦的工作阶段,往往是自己能力和心态进步比较快的阶段,而有时候工作一切都已摆平、风平浪静,可以悠哉游哉的时候,半年过去,发现自己一无所获,毫无建树,其实内心深处更加焦虑和痛苦。我后来总结过很多管理工作的要点和戒律,也总结了一句话,叫做“成功人士就是经常成功地跟自己过不去的人士”。

2003年下半年,数据中心建成后,IT运作这一块,在多年的岌岌可危之后,终于有点风平浪静的意思了,为了“跟自己过不去”,其实也是为了自己的兴趣,我向领导申请去信息安全部并得到了批准。当时业界还处在冬天时期,华为在冬天时期,不但面临竞争对手的威胁,更严重的是面临内部的威胁,屡屡爆发的重大产品、商务信息泄密,给公司造成了重大的损失,信息安全形势十分严峻,也触发了公司最高领导层对信息安全工作的超级重视。信息安全工作是是一个基本纯防守的工作,防守战线太长太长,整个系统的防守强度取决于最薄弱环节,而攻击者却可以集中资源,只要攻其一点即可。我到信息安全部,发现我们的管理体系、政策体系经过几年的努力,已经有一定的建树,而技术方面的能力却是很薄弱的环节。因此,重点在此方面开展了工作。几年之内,我们部署了很多防护系统,也培养了一批人,在我离开信息安全部时,整体上应该讲有了较大的改变。

调到信息安全部工作期间,其实给我最深的体会是跨部门的合作,在原来部门时,信息安全部也经常来“烦”我,我的反应经常的是排斥和不满,到了信息安全部 后,变成经常是我得去“烦”别人,并且我们部门是特别讨人“烦”。如何取得他人的合作?是一直来磕磕碰碰的难题。比如 SPES开发和推行这个大项目,要 “烦”的人实在太多了:数据中心、网络部、PC、海外IT、研发信管办、销服信管办、采购、发货、进出口部、物流、各国代表处、公司各级领导、最终用户等等。在不断地“烦”人的过程中,我总结出了一套“合作方法论”,有很多道道,不过最终总结起来,一句话简单说就是“如果你总是抱怨别人跟你不合作的时候,问题一定是出在你自己身上。”

03年底,当时业界连续几次蠕虫的发作,部门几个技术人员一直在讨论如何搞一个方案对付这个问题,我们设想了种种可能性,最后部门技术大牛季昕华提出一个设想:把客户端的软件和网络上的设备联动起来来控制蠕虫,并且做了一个很有意思的胶片,把对付SARS的手段用来对付蠕虫了。我一下子被这个新颖的设想所吸引,后来我在此基础上与大家多次讨论进一步扩展了概念,提出了策略强制系统的概念。为了让我们的设想能够付诸现实,我在部门其实并未授权的情况下,偷偷搞了几个人,花了半年时间把POC系统做了出来。 POC系统刚出来,我们就听到了CISCO在04年中发布了其SDN/NAC产品概念,跟我们的思路非常接近,这给了我们很大的信心,后来我干脆主动请缨,放弃其他管理事务,全职投入到组建一直开发队伍,开发SPES产品中去。最终我们产品开发成功了,在公司全球100多个国家6万多员工大规模的推广也成功了,并且在公司内部良好运行至今。这件事给我最大的启示是:我们要有信心、要敢做,CISCO并不可怕。说老实话我们是一支很土八路的队伍,也不属于公司的研发体系,我们这支土八路的队伍,坐了2年冷板凳,磨啊磨啊,最终还真磨出来一个还不赖的东西。 2004年底,在磨出来这个东东之后,我们又开始张罗产品认证、组织市场活动、策划定价及销售策略、寻求多方合作、建设支持体系等,在我们经过艰苦的市场拓展,客户已经开始广为感兴趣并已经形成几单实际销售的情况下,公司由于政策问题,为了确保资源最大限度投放到公司内部工作以支持公司海外市场的大发展,叫停了我们真正做成对外销售的产品,虽然我理解公司的大方针,但这个决定还是让我非常痛心,否则我相信今天这个产品很有可能已得到更大的发展。前不久我去北京出差,跟一个公司产品的代理商偶尔聊天,他不知道我是SPES的主要负责人,大大的吹了一通我们的东东并很惋惜为什么不卖,不禁让我又喜又悲。

转眼工作十年了,在华为的十年,正是华为从名不出专业圈子到现在成为路人皆知的大公司,高速发展的十年,见证了公司多年的奋斗历程。也投身其中,在大潮中边学边游泳,走到今天。现在我要离开公司了,准备去开始新的事业,接受全新的挑战,我将要去做的事情,风险很大,很有可能是九死一生,九死后还能不能有一生,也难说。在开始新的事业之前,想起了对过去的十年做个一个详细的总结。在一个象华为这样高速发展的大企业工作,有时是一种炼狱般的锻炼,如果我能够总结十年的经验和教训,从中学到关键的做事、做人的道理,我想对将来一定大有益处。

这些年来有些人离开公司,写一些东西或书,对公司指手画脚、评头论足、指点江山,对公司的高层领导逐个点评一番,我个人感觉除了带来一些娱乐价值,还有什么益处呢?公司照样在发展,发展的背后,6万人种种梦想、努力、贡献、牺牲、奋斗、抱怨、不满、沉淀、离去、希望、失落;发展的背后,种种机会、重大决策、危机、失误等等的内在逻辑又岂是局外人说得清楚?我不想多说公司,只是想对自己的工作经历好好反思反思,想想自己做了什么努力,做了什么贡献,做了什么自己最高兴、做了什么自己最受益、学到了什么?总得说来,我在华为的十年是懵懵懂懂过来的,当初我好像没有什么远大的理想、没有详细的规划,只是想着把一件一件事情做好。通过自己的总结和反思,将来我希望自己能够更加有规划、更加清晰一点。

大概想了想,我觉得有以下几点,是这些年深有体会的经验和教训,值得今后再发扬。

一、 “从小事做起,学会吃亏,与他人合作”,这是研究生毕业前最后一堂课,电子电路的老师最后送给我们几句话,虽然我忘了这位老师的名字,但这几句话却至今铭记。在华为的工作实践,越发感受到这简单的几条的道理深刻。从小事做起不是一直满足于做小事,也不是夸夸其谈好高骛远。学会吃亏不是忍受吃亏,是不斤斤计较于一时一地的是非得失,是有勇气关键时候的放弃。

二、“心有多大,舞台就有多大”,我们很多的成功,来自于敢想,敢做,就象我第一次接到问题单,根本不懂,但敢去试,敢去解决,还真的解决了;就像 我们做 SPES,即使没人、没技术、没积累,还有CISCO等大公司也在做,我们也敢做,敢推行,不盲目崇拜或畏惧权威,也取得了成功。当然,这不只是盲目的胆大,心大还意味着积极地关注广大的外部世界,开阔宽容的心胸接受种种新鲜事物。

三、 “好好学习,天天向上”,这句话用来形容对IT人的要求,最贴切不过了。真正的成功者和专家都是“最不怕学习”的人,啥东西不懂,拿过来学呗。我们 IT 现在有个技术大牛谭博,其实他不是天生大牛,也是从外行通过学习成为超级专家的,他自己有一次跟我说,当年一开始做UNIX系统管理员时,看到#提示符大吃一惊,因为自己用过多年在UNIX下搞开发都是%提示符,从未有过管理员权限。看看专家的当初就这水平!当年跟我做备份项目时,我让他研究一下 ORALCE数据库时点回退的备份和恢复方法,他望文生义,以为数据库的回退是象人倒退走路一样的,这很有点幽默的味道了,但他天天早上起来,上班前先看一小时书,多年积累下来,现在在系统、数据库、开发等多个领域已成为没人挑战的超级专家了。但是,学习绝对不是光从书本学习,其实更重要的是从实践工作中学习,向周边学习。比如说我在华为觉得学到最重要的一个理念是“要善于利用逆境”,华为在冬天的时候没有天天强调困难,而是提出“利用冬天的机会扭转全球竞争格局”并真的取得成功,如果没有这个冬天,华为可能还要落后业界大腕更多年份;华为在被CISCO起诉时没有慌乱,而是积极应对,利用了这次起诉达到了花几亿美金可能达不到的提高知名度的效果。等等这些,把几乎是灭顶之灾的境遇反而转化为成功的有利条件,对我留下的印象十分深刻,也对公司高层十分佩服。

四、勇于实践,勇于犯错,善于反思。很多事情知易行难,关键是要有行动,特别是管理类的一些理论、方法、观念。空谈、空规划一点用处都没有,不如实 际把它做出来,做出来后不断反思改进,实实在在最有说服力。没有实践中的反复演练和反思,即使是人人皆知的东西要做好都其实不容易,举个小例子,比如做管理者要会倾听,我想华为99.9%的管理者都很懂这一点,但实际做的如何呢?华为有多少管理者做到了不打断别人讲话?不急于下结论给定义?不急于提供解决方案?有多少管理者能够做到自然地引导对方表达?问问对方感受?确认自己明白对方?

五、要有方法、有套路,对问题系统思考、对解决方案有战略性的设计。在前几年的工作中,由于取得了一点成功,技术上也有了一点研究,就开始夜郎自大 起来了,后来公司化重金请来了大批顾问,一开始对有些顾问还真不怎么感冒。后来几年公司规模越来越大、IT的复杂性越来越增加的情况下,逐渐理解了很多。西方公司职业化的专家,做任何事情都有方法论、有套路,甚至于如何开一个会都有很多套路,后来我对这些套路的研究有了兴趣,自己总结出了不少套路并给部门的骨干培训和讨论。在一个复杂的环境下,很多问题已经不能就事论事来研究和解决,非常需要系统性的方法和战略性的眼光。对于一个组织的运作来讲,制度和流程的设计尤其需要这一点。爱恩斯坦说过: We can’t solve problems by using the same kind of thinking we used when we created them.

六、独立思考,不人云亦云。公司大了,人多了,混日子也容易了。人很容易陷入随波逐流、不深入业务的境地,而看不到问题和危险。专家有过一个研究, 雪崩发生时,一般受害者都是一批一批的,很少有单个人的受害者,原因很简单,单个人在雪崩多发地会相当小心和警觉。但一个群体,群体越大,每个个体就会有一种虚幻的安全感和人云亦云的判断,但现实是不管群体的力量有多大,雪崩都是不可抵抗的。因此我觉得在大的机构里,保持独立思考的能力尤为重要。

七、少抱怨、少空谈、积极主动,多干实事。我曾经是个抱怨很多的愤青,经常容易陷入抱怨之中。但多年的工作使得我有所转变,因为知道了抱怨是最无济 于事的。世界上永远有不完美的事情,永远有麻烦,唯一的解决之道是面对它,解决它。做实实在在的事情,改变我们不满的现状,改变我们不满的自己。实际上也有很多值得抱怨的事情都是我们自己一手搞出来的,比如社会上很常见的是高级干部退下来了,抱怨人心不古、感慨世态炎凉,如果好好去探究一下,原因很可能是他权位在手春风得意时不可一世、视他人如粪土造成的。

八、对职业负责、对目标负责,对自己负责,成功者往往自觉自律、信守承诺、心无旁骛。大企业肯定会有绩效考核、会有论功行赏、会有KPI、会有领导 指示、甚至会有一点企业政治,但如果我们片面地追求考核成绩、片面追求KPI指标、片面追求权钱利益,片面地对上负责、对别人负责,而不对自己负责、不对自己的目标负责,失去工作的使命感、责任心、热情和好奇心,必将不能达到自己的最佳境界。而一个企业如何能够成功营造一个环境,让每个个体尽量发挥到最佳境界,企业也会战无不胜。

九、多点人文修养和审美情趣,看起来与工作不怎么相关,其实太相关了。杰出成就的取得离不开对美的境界的追求,最伟大的科学发现,往往蕴涵着秩序、简洁和美。缺乏一点审美的追求,什么UGLY的事情都敢做、不择手段、凡事凑合,一点都不“高雅”,必将不能长久。

十、 “大家好,才是真的好”,关注人,帮助人,真诚待人,厚道做人。快速发展的现代社会,由于媒体的作用,过分渲染了人与人之间日益冷漠、诡诈的关系,但实际的社会、社区可能真的不是那么回事,起码我来华为之前,对一个大企业中工作的人事关系开始还有点未知的恐惧,但实际上在这个集体中的感觉几乎人人都能开放、真诚相待,关系融洽和谐。所以关键是我们自己要能够真诚对待他人,在与他人互动中将心比心。当然,工作中的冲突是不可避免的,实际上冲突也是没有必要去避免,甚至很多冲突对组织来讲,是大有益处的。就象夫妻吵一架后感情往往更好。只要我们掌握两大原则:1)对事不对人,2)与人为善。就肯定能把适度的冲突引导到对自己、对组织都有利的方向。

十一、开放和分享的态度,在一个高科技公司工作,如果报着保守和封闭的心态,成长肯定会受阻。

十二、做好时间管理。在华为工作十年,3650天,工作日3000天左右,这些时间是不是花在最重要的事情上了,有效的、有产出的工作时间究竟有多少,实在值得怀疑。时间管理是我在华为工作当中最大的教训之一,可能也是公司整体性的问题,工作缺乏计划,经常是面临不断的被打断;或者是不断去打断同事下属;或者是不断的会议、讨论,占去绝大部分的时间;或者是被自己的兴趣所牵引,花大量时间搞一些不着边际的事情;或者是花很多时间在一些细枝末节的事情上,把很难很重要的事情一直拖到非解决不可的地步然后被迫仓促行事。现在回想,如果真的能管理好这十年时间,我觉得成就应该大很多。

在华为的十年,还有一笔最宝贵的财富是结识无数优秀的同事、朋友,他们给予我很多启发、给予我无私帮助,要感谢无数给予过我帮助、启发的人:

首先感谢我的师傅王忠宁和二师傅祈宇,是他们带着我走上了工作岗位的第一步并真诚地帮助我。或许是由于左手有六个手指头的缘故,师傅个性偏执,牢骚满腹,与很多人合不来。但我跟他一年多,一起抽烟、一起在冰冷的机房喝冰冷的可乐、一起发牢骚、一起到路边小摊吃炒米粉,无话不谈,成了最好的朋友,他对自己的事情高度负责的精神和刚直的个性给了我深深的感染。他终身未婚,在99年不幸患肝癌离世。去世前几天,我去医院看他,给他送了一朵鲜红的玫瑰花,希望他能够把花献给他喜欢的、住院期间给他很好照顾的护士,他非常高兴。

感谢我的老领导许总,刚到部门时他给我们做ERP培训,我们班上所有的人都皱着眉头很痛苦,因为都听不懂他的诸暨话。而我大喜,因为我也是浙江诸暨人。作为公司元老级人物,许总这么多年来工作激情丝毫不减,让人佩服;许总经常骂我们,甚至狗血喷头,但他也是最经常请我们吃饭的领导,点菜的水平很高,酒德很好…也感谢曾经作为我领导的郭总、袁总、李总、胡总、洪总、周总、陆总、付总等,他们给予我太多机会、给予我太多宽容,我从他们身上也学到很多很多。

感谢太多同事和下属,不管是还在华为或者已经离开的,曾经为了支撑我们的工作目标,他们承担太多压力、默默付出太多。科技园我们的机房值班人员邓迅雷,天天晚上彻夜坐在冰冷而空气不好的机房里,为了防止老鼠咬断网线,想了种种办法捉老鼠。周振惠老婆在医院生孩子,他却半夜在公司加班处理自动仓库的紧急问题。EMAIL系统出问题内存泄漏,在找到根源之前,向阳连续2天24小时坐在电脑前监视和及时重启服务。WDGL服务器几百G数据全部丢失,沈勇偷偷摸摸、吭哧吭哧折腾了半个多月,借信用卡从美国自费买了软件,最终终于把数据恢复回来,避免了一场IT的灾难。SPES开发组,一开始基本是在师出无名失败风险极大的情况下,成年累月日夜奋战,幸好后来胡总力排众议鼎力支持,才终于搞出来一点土土的东西。SPES在海外实施时,柯晓宇在埃及去机场遇车祸,清醒过来第一反应是赶紧再找车去机场,否则误机了耽误下一个地区的实施。吴橹晓楠等人,瞒着家人和老婆,抢着要去伊拉克,还以为那儿可以搞支AK47 玩玩。孙颖单身女将,独闯欧亚诸国,李晶顾磊在孟加拉上吐下泻,打电话回来说话的力气都没有,照样圆满完成超出预计复杂度的任务。还有小宋、小曹、周讯、老翟、老刘、家汉、牟头、老叶、陈君、伏朝阳、李斌、小麦、张华彦、齐燕英、鲁飞、闵朋、曾宇斌、邓湛、钟美琴等等等等……,一回忆太多太多扑面而来,真是不能一一列举。

感谢我们部门所有默默无闻、给予我们无数帮助的秘书MM,小吴、小关、梁、沈、肖、王、龙等等,特别感谢我97年刚到公司时的秘书李丽东,做事雷厉风行,我新员工刚报到时用一台电脑没多久,有个老员工过来说这个电脑是他的,他要拿走。我赶忙向许总求救,许总听完我的汇报后,抬起头:“嗯&@$# %,我们部门的电脑怎么管理怎么这么混乱?必须加以改进了!”之后一时没下文,我也不知道怎么办,灰溜溜回到了座位上发愁,看到小李起身慢慢走到那个老员工前面,劈头盖脸狂骂一顿,不知道说了些啥,走回来时,拍拍我肩膀“徐家骏,搞定了”。当时我对她崇敬不已,简直须仰视可见。之后有一天,她上班的时候叫我,“徐家骏,到我家去一趟”,我乐呵呵的去了,把她的一台破24寸电视机从蛇口的一端搬到了另一端的修理站,当然,这算是外出公干!

感谢若干多的供应商销售和支持人员、顾问,多年来我有时把他们逼得走头无路。DEC的罗辉、SUN的李建文、IBM的GARY、ORALCE的张力、高波等等等等,都是我崇拜的大牛,从他们我学到了很多很多。我最佩服的张力有一个本事无人能及,他能端端正正地坐着,手放在键盘上,头直直得好像在盯着屏幕,然后睡着并且打很大的呼噜。98年我们系统从10.6升级到10.7,我陪着他一口气干了30个小时,中间偶尔等系统在跑,他就这样睡着了。我盯着系统,一跑完就叫他,他眼睛一睁,手就开始动了,中间遇到重重难关,他都不慌不忙,很帅,很有大将风度。升级完后,我跟他去海景酒店的房间休息,我也学他,在洗澡的时候睡着了,从浴缸里咣噹摔到了外面地上,他煞有介事的冲过来“干啥干啥呢?这么大动静!”。

感谢在我喝醉稀巴烂时半夜扶我一直到家里的王涛,感谢在我发高烧一人倒在中心医院重症抢救室时前来救我的老罗、建新,老罗陪我一夜后第二天又正常来上班 了,并且晚上又加班了;我一直希望自己也有他那牛一样的金刚不坏之躯。还有他太太,细致入微,给我买了各种必要的住院物品,在困难之中倍感温暖。

感谢我的父母,他们大半辈子都在极艰苦、极勤奋、又是快乐中度过,他们给了我最无私的爱,也给了我最大的宽容和自由。从初中开始,凡有我的重大决定,他们都让我自己做主。初中考高中,冒着没学上的风险,我要考县里的中学,他们支持我。考大学,他们说“清华是好的,北大是好的,科大也是好的…”,大学毕业找工作,他们说“联想是好的,方正是好的,考研也是不错的”,研究生毕业,他们说“华为是好的…”虽然他们没听说过华为,只知道是家民营企业不大保险。找老婆时他们说“这个媳妇真好…”,并且要求我不许欺负她,而不顾实际情况真好相反。

感谢我的太太,虽然欺负我,但对我的工作和所有怪念头都理解和支持,我工作太忙过,也发烧过 PDA、发烧过智能手机、发烧过钢琴、发烧过小提琴、发烧过 APPLE,有时候回家陪这些“小情人”比陪她的时间多,她都能谅解。她对金钱和名誉常常很不在乎,家庭财务也一塌糊涂。不过做事雷厉风行、执行力超强,我刚提离职,她就以迅雷不及掩耳盗铃之势把我们的房子卖掉了。

感谢我的女儿,虽然她才不到二岁,但她带给我和太太的快乐和幸福简直难以描述。在养育她的过程中,我们自身不断学习、反思,也得到很大的提高,小孩的成长也是我们父母重新成长一次的机会,在与她互动的过程中,我觉得最主要的不是我和太太教育她,而是她教育我们,她触发了我们更好地去面对、体会、反思、感悟生活和人生,并且她也触发了我很多关于管理的深入思考,感觉育儿和管理很多方面真是很相通的。为此我还专门开了一个博客,把自己对于儿童教育、管理等的感悟记录下来。

最后感谢公司老板,给我们提供了这样一个工作平台,在这个平台上我们努力过、奋斗过、沮丧过、抱怨过、成功过、快乐过…我们从一个土老冒逐渐成长为一个职业人。真心说声谢谢!希望公司变得越来越强大,越来越成为中国人在世界上的骄傲。

[zz]程序员应该做的事情

程序员每天该做的事

1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多

2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作

3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢

4、考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍

5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示

6、记住一位同事的名字及其特点 你认识公司的所有同事吗?你了解他们吗?

7、清理自己的代码 今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?

8、清理自己的桌面 当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净

程序员每周该做的事

1、向你的老板汇报一次工作 让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定

2、进行一次自我总结(非正式) 这周之内自己表现得怎么样?该加分还是扣分?

3、制定下周计划 把下周要做的事情列出来,一样要分清楚优先级

4、整理自己的文件夹、书柜和电脑文件 把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉

5、与一个非公司的朋友沟通 它山之石,可以攻玉

6、看一本杂志 找一本适合自己的专业杂志

7、纠正自己或同事一个细节上的不正确做法 《细节决定成败》看过了吗?没看过强烈建议先看看

程序员每月该做的事

1、至少和一个同事一起吃饭或喝茶 不光了解自己工作伙伴的工作,还要了解他们的生活

2、自我考核一次 相对正式地考核自己一下,你对得起这个月的工资吗?

3、对你的同事考核一次 你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?

3、制定下月的计划,确定下月的工作重点

4、总结自己工作质量改进状况 自己的质量提高了多少?

5、有针对性地对一项工作指标做深入地分析并得出改进的方案 可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。

6、与老板沟通一次 最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点

程序员每年该做的事

1、年终总结 每个公司都会做的事情,但你真正认真地总结过自己吗?

2、兑现给自己、给家人的承诺 给老婆、儿子的新年礼物买了没有?给自己的呢?

3、下年度工作规划 好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干?

4、掌握一项新技术 至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。 掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog

5、推出一种新产品 可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的

6、与父母团聚一次 常回家看看,常回家看看

 
Photo 1 of 8
More albums (1)