阐述一下个人的观点,希望大家热烈讨论[问题点数:0分,结帖人:arthersophy]
arthersophy
(胡 泽 新)
等 级:
结帖率:95.83%
楼主发表于:2009-01-21 16:51:28为什么要设计库?
1: 封装代码,不希望别人看到自己具体实现的代码。就好象你能用xp,但是你不知道具体实现代码一样,因为微软已经对xp的代码做了封装。
2: 重用性,如果一个软件的很多地方都用到了同样的模块,当需求有变化的时候或者其他情况,需要你去修改此类模块的操作,那么你要做的就是把所有的代码块全部改一遍,如果运行好,会很顺利,否则,麻烦就来了。。(我就遇到过)。这是就需要你将这些功能相同的代码抽出来,封装成库。这样你修改的时候,只要修改一下库就好了。
3:如果是移动开发,手机上资源不是很宽裕,我们要节省一切能节省的,从另一个方面,也体现了一个编程人员的职业素质。同样功能的一个软件,有人用200k,有人却要用400k,这在实际开发中很正常。所以,尽可能的增加你程序里的代码模块的重用性。
好了,说了些基本的常识,下面说一下开发中要实际考虑的东西。这里我不会阐述具体的实现过程,如果有疑问,请看我以前的帖子。
lib/ dll / .h 静态链接库,动态链接库,头文件。
为了能够更好的理解,我从编译原理的角度来阐述一下关于程序的编译和link和run
程序编译的时候,我感觉其实就是检查语法,比如有在引用的头文件里有没有引用具体函数命名,返回值类型,哪怕你就写一个空函数,里面什么都不做,编译期也会通过。(大学的编译原理,没想到现在我还记得,呵呵),在此期间不会加载lib文件的。
lib 静态链接库,顾名思义,静态加载的,在程序link的时候就要加载进程序。在程序link的时候,会将对应的lib加载到程序中来,说明白一点,就是将lib中的代码对应加载到程序中来。加载完了,lib就没事了因为这个时候lib中代码就拷贝到了你的程序中。你也可以试试,当你写一个lib时,的方法体没有,和方法体很大的时候,所生成的可执行文件大小是不一样的。呵呵。link之后,你就可以run你的执行文件了....
dll 动态链接库,前面说到了,静态链接库在link的时候加载,如果你的程序很多地方用到了lib,那么恭喜你,你会发现你的程序大小还是没有明显变化,呵呵。
动态链接库,当程序用到的时候才会去加载,你只需要将生成dll装入手机就好了,其实我们平时用到的系统的很多方法都是东动态链接库,系统已经将这一部分集中到了手机操作系统里面,就好象微软自带的iis一样,说点具体的,动态链接库有两种实现方式:
1:直接加载dll,这种方法最省运行期内存,比如你的软件有更新的功能,宁可讲讲这部分功能写成动态dll,更新完了,加载的dll所占用的内存就被释放掉了。但是这样写比较麻烦,一般用于插件,或者是不成用到的功能。
2:.h + lib +dll
这种方式比较常用,你可能会疑惑为什么这是还会有lib,其实这个时候lib里的内容是dll的索引(关于这点,我只是猜测,没有经过证实,希望有知道的朋友可以和我说一声 邮箱:autherhuze@163.com),同时你会发现这个lib的大小很小,很生成的dll相对较大。
关于内存节省的问题:
说到这里,不得不说,其实节省内存,所说的就是节省运行期内存,程序退出以后,不会占用内存,但是即使通过dll的方式也不是很容易做到节省内存。这需要我们对一个软件的整体设计和架构,还有编码人员的编码素质。
symbian 3rd上一个应用程序栈最大是80k(0x14000 ),需要我们在编码中,成员变量用到tbuf的,尽可能用hbuf,应为你用tbuf,肯定是开最大的长度,而且当实际值超过时,程序就崩溃了,很麻烦的。
用hbuf的话,就没有那么麻烦了,实际内容有多大就是多大。没有过多的内存浪费,也没有长度不够的危险。