Mar 26, 2010
【Csdn 10月24日 现场报道】10月24日,有Csdn和《程序员》联合主办的代表业界最高水平的技术盛会SD2.0大会进行到了最后一天,在上午,互联网架构师康晓宁向关注架构设计的与会技术人员分享了他多年来的实践心得。
康晓宁的讲演主题很有趣,叫做网站那些事儿,他希望以一种轻松的方式同大家一起交流在架构设计的实践经验。他认为网站只不过是一种特殊的软件,即互联网时代的软件。由于面对的最终用户和市场不同,它的开发呈现出快,猛,糙的特点。对互联网架构师提出更高的需求。
这种高,并不代表需要多么高新的技术,而是架构师针对需求,制定出来合理的架构的能力要求更高。
互联网架构是个年轻的技术领域,互联网架构师面临诸多烦恼。例如,多个层面上的设计,知识面不足;架构设计开发经常要同紧张的时间赛跑;新技术方案和优化手段众多,难以抉择。
随后就是本场课程最有价值的内容康晓宁总结自多年架构实践的互联网架构设计/优化原则。这些原则受到与会学员的极大欢迎。
讲师介绍:康晓宁,Googel软件工程师,清华大学计算机系硕士,曾任清华大学BBS 水木清华站技术站务,供职于数家国内大型网站,从事一线开发和运维工作。
If you enjoyed this post, make sure you subscribe to my RSS feed!
Mar 25, 2010
版权声明
本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
二、将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
EXAMPLE:VideoDeCoder.DEF 文件内容如下Dump of file VideoDeCoder.dll
File Type: DLL [...]
Mar 25, 2010
不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替换它。尽管如此,既然大家对它比较感兴趣,我就简单总结一下它的使用和需要注意的常见问题。
原理
刚学C语言的时候,一般人都会首先接触printf函数。通过这个函数,你可以打印不定个数的变量到屏幕,如:
printf(”%d”, 3);
printf(”%d,%d”,3,4);
上述代码看似简单,实际上却需要我们解决许多问题。在我们设计printf的时候,我们是不知道到底会传入几个参数的。在这种未知的情况下,我们需要解决下面几个问题:
怎么告诉printf我们会传入几个参数
printf怎么去访问这些参数
函数调用完成后,系统怎么把参数从传递用的堆栈中释放
为了解决这些问题,我们首先要解释cdecl调用约定(参见论调用约定),所有使用不定参数的函数必须是使用cdecl(全局函数)或者this call(类成员函数)调用约定。该约定对于参数传递规定如下:
参数从右向左入栈(也就是如果你调用f(a,b,c),则c先入栈,然后是b,最后是a入栈)
调用者负责清理堆栈
其中第二点直接解决了前面三个问题中的第三个问题。我们来详细说说其他两个问题。
确定参数的个数
在一个函数中,一般有如下prolog代码:
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,48h
执行上述代码之后,func(a,b,c)函数所处的堆栈上下文就变成如下布局:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/arong1234/archive/2008/05/18/2456455.aspx
其中,ebp指向保存旧的ebp的堆栈内存的下一个字的地址,ebp+8指向eip地址,ebp+12则指向函数调用的第一个参数,而ebp和esp之间是用于临时变量(也就是堆栈变量)的空间。
注意,由于上述prolog代码的存在,我们很容易通过ebp得到第一个参数的地址,对于不定参数列表之前的类型固定的参数,我们也可以根据类型信息得到其实际的位置(例如,第一个参数的位置偏移第一个参数的大小,就是第二个参数的地址)。
注意不定参数函数有个限制,就是不定参数的列表必须在整个函数的参数列表的最后。我们不可以定义如下的函数:
void func(int a, …, int c)
所有类型固定的参数都必须出现在参数列表的开始。这样根据前面的论述,我们就可以得到所有类型固定的参数。
在设计具有不定参数列表的函数的时候,我们有两种方法来确定到底多少参数会被传递进来。
方法1是在类型固定的参数中指明后面有多少个参数以及他们的类型。printf就是采用的这种方法,它的format参数指明后面每个参数的类型。
方法2是指定一个结束参数。这种情况一般是不定参数拥有同样的类型,我们可以指定一个特定的值来表示参数列表结束。下面这个sum函数就是一个例子:
int sumi(int c, …)
…{
va_list ap;
[...]
Jan 26, 2010
不知觉间,php使了两年多了,中间踩过不知多少坑,当然,也从中体悟到
很多东西,也做了不少东西,多多少少有些感想,慢慢总结下来吧。
1 php语方层面很随意:
这也主要是由它的功能及所属的层面决定的吧。php弱类型,在变量比较的
时候可以选择使用==或===,前者表示变量转换成同类型后的值是不是相等,
而后者则是要求首先是类型相同,然后值也相同。
php变量可以动态定议,它不需要提前定意一个变量,也不必要定义的时候
指定该变量的类型。比如var $variable;则一个$variable变量便产生了,
它的类型实际是由赋于它的值决定的。因此这一方面,使用都可以少了许多
束缚。
2 php有很好的正则支持:
php提供了较为丰富的正则支持,如preg_match, preg_match_all等。
如果想从一个字符串或文件中提取出来一些片段,那是十分方便的。比如
有如下文本:
192.168.1.1 xxx user:zja601 url:http://blog.niukey.com
如果我们想提取出user和url的话,如简单语句就可搞定:
if (preg_math(’/^.*user:([^\s]*)\surl:(.*)$/’, $string, $arr_result)) {
printf(”user is:%s url is:%s”, $arr_result[1], $arr_result[2]);
}
简单吧,当然,shell脚本可能会有更简单的办法,比如:sed -n ’s/^.*user:\([\s]*\)\burl:\(.*\)$/\1 \2/p’
但php可以结合其它的一些场合,而不像shell那么孤立的功能,使得整体功能更加
灵活。
3 php有强大的函数库:
比如数组$_GET参数到字符串形式的来回转换,有explode和build_string_query就很轻
松的搞定了。比如数组的array_merge,push, pop等等,可能帮助你事半功位。比如php数
组的强大功能,给你在c/c++花很大力气才能达到的效果。比如操作pdf,文件等函数,在
需要的时候文档一下即可搞定。
4 php对面向对象的思想支持的也相对不错:
从php4之后,php对面象对象支持的越来越好。特别是interface的抽象,可能使设计的
时候更加关注接口间的合理性考量。php的继承关系也达到了一个很好的复用效果,如果你
是一位C++爱好者,那么也试一下php的C++版本吧,一定会有不错的效果。php的对象的
执行也是动态的,就是在c++或java里讲的后期绑定吧。
5 php语言的动态性:
php语言具有动态性,它在动态执行的时候,解析代码。源代码写好即可执行,不必要
经历一个繁琐的编译过程。动态性也表现为程序运行时解析,因此它只解析运行到的代码
而不去解析未执行的代码。(尽管有人说这一点并不太好)动态性的另外一个层面就是上
面讲的对象的动态性了。
其实php也有其内在的陷阱
比如函数参数的引用传递,比如函数返回值的引用返
回,这些都有可能造成php的fatal的出现。另外,正是由于php的弱类型,往往有
时候,我们不能很精确的把握程序进行时的值或状态。如果真的想得到当时的值或
状态,可能花费的力气并不值得(并不是做不到)。php的@符号用来抑制一些错误
的报出,有时候不做一些额外的判断,就有可能有意想不到的问题产生。php函数名
的长度会影响其执行的效率,这可能许多程序员不会注意到(当然很多场合不必要去
注意这些事),尽管我们选择php语言,不是选择它的效率。php动态执行,因此一
些有基本语法错误的地方,如果程序运行时走不到,那么有可能就不会被发现。诸如
此类的还有很多。。。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!